diff --git a/user_guide_src/Makefile b/user_guide_src/Makefile
new file mode 100644
index 0000000..519e113
--- /dev/null
+++ b/user_guide_src/Makefile
@@ -0,0 +1,130 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/CodeIgniter.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/CodeIgniter.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/CodeIgniter"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/CodeIgniter"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	make -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/user_guide_src/README.rst b/user_guide_src/README.rst
new file mode 100644
index 0000000..1c27fc2
--- /dev/null
+++ b/user_guide_src/README.rst
@@ -0,0 +1,63 @@
+######################
+CodeIgniter User Guide
+######################
+
+******************
+Setup Instructions
+******************
+
+The CodeIgniter user guide uses Sphinx to manage the documentation and
+output it to various formats.  Pages are written in human-readable
+`ReStructured Text <http://sphinx.pocoo.org/rest.html>`_ format.
+
+Prerequisites
+=============
+
+Sphinx requires Python, which is already installed if you are running OS X.
+You can confirm in a Terminal window by executing the ``python`` command
+without any parameters.  It should load up and tell you which version you have
+installed.  If you're not on 2.7+, go ahead and install 2.7.2 from
+http://python.org/download/releases/2.7.2/
+
+Installation
+============
+
+1. Install `easy_install <http://peak.telecommunity.com/DevCenter/EasyInstall#installing-easy-install>`_
+2. ``easy_install sphinx``
+3. ``easy_install sphinxcontrib-phpdomain``
+4. Install the CI Lexer which allows PHP, HTML, CSS, and JavaScript syntax highlighting in code examples (see *cilexer/README*)
+5. ``cd user_guide_src``
+6. ``make html``
+
+Editing and Creating Documentation
+==================================
+
+All of the source files exist under *source/* and is where you will add new
+documentation or modify existing documentation.  Just as with code changes,
+we recommend working from feature branches and making pull requests to
+the *develop* branch of this repo.
+
+So where's the HTML?
+====================
+
+Obviously, the HTML documentation is what we care most about, as it is the
+primary documentation that our users encounter.  Since revisions to the built
+files are not of value, they are not under source control.  This also allows
+you to regenerate as necessary if you want to "preview" your work.  Generating
+the HTML is very simple.  From the root directory of your user guide repo
+fork issue the command you used at the end of the installation instructions::
+
+	make html
+
+You will see it do a whiz-bang compilation, at which point the fully rendered
+user guide and images will be in *build/html/*.  After the HTML has been built,
+each successive build will only rebuild files that have changed, saving
+considerable time.  If for any reason you want to "reset" your build files,
+simply delete the *build* folder's contents and rebuild.
+
+***************
+Style Guideline
+***************
+
+Please refer to source/documentation/index.rst for general guidelines for
+using Sphinx to document CodeIgniter.
\ No newline at end of file
diff --git a/user_guide_src/cilexer/README b/user_guide_src/cilexer/README
new file mode 100644
index 0000000..b9d9baf
--- /dev/null
+++ b/user_guide_src/cilexer/README
@@ -0,0 +1,22 @@
+To install the CodeIgniter Lexer to Pygments, run:
+
+	sudo python setup.py install
+
+Confirm with
+
+	pygmentize -L
+	
+
+You should see in the lexer output:
+
+* ci, codeigniter:
+    CodeIgniter (filenames *.html, *.css, *.php, *.xml, *.static)
+
+You will need to run setup.py and install the cilexer package anytime after cilexer/cilexer.py is updated
+
+NOTE: Depending on how you installed Sphinx and Pygments,
+you may be installing to the wrong version. 
+If you need to install to a different version of python
+specify its path when using setup.py, e.g.:
+
+	sudo /usr/bin/python2.5 setup.py install
\ No newline at end of file
diff --git a/user_guide_src/cilexer/cilexer/__init__.py b/user_guide_src/cilexer/cilexer/__init__.py
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/user_guide_src/cilexer/cilexer/__init__.py
@@ -0,0 +1 @@
+
diff --git a/user_guide_src/cilexer/cilexer/cilexer.py b/user_guide_src/cilexer/cilexer/cilexer.py
new file mode 100644
index 0000000..265b407
--- /dev/null
+++ b/user_guide_src/cilexer/cilexer/cilexer.py
@@ -0,0 +1,24 @@
+import re
+import copy
+
+from pygments.lexer import DelegatingLexer
+from pygments.lexers.web import PhpLexer, HtmlLexer
+
+__all__ = ['CodeIgniterLexer']
+
+
+class CodeIgniterLexer(DelegatingLexer):
+    """
+    Handles HTML, PHP, JavaScript, and CSS is highlighted
+    PHP is highlighted with the "startline" option
+    """
+
+    name = 'CodeIgniter'
+    aliases = ['ci', 'codeigniter']
+    filenames = ['*.html', '*.css', '*.php', '*.xml', '*.static']
+    mimetypes = ['text/html', 'application/xhtml+xml']
+
+    def __init__(self, **options):
+        super(CodeIgniterLexer, self).__init__(HtmlLexer,
+                                               PhpLexer,
+                                               startinline=True)
diff --git a/user_guide_src/cilexer/setup.py b/user_guide_src/cilexer/setup.py
new file mode 100644
index 0000000..db4bbea
--- /dev/null
+++ b/user_guide_src/cilexer/setup.py
@@ -0,0 +1,23 @@
+"""
+Install and setup CodeIgniter highlighting for Pygments.
+"""
+
+from setuptools import setup
+
+entry_points = """
+[pygments.lexers]
+cilexer = cilexer.cilexer:CodeIgniterLexer
+"""
+
+setup(
+    name='pycilexer',
+    version='0.1',
+    description=__doc__,
+    author="EllisLab, Inc.",
+    packages=['cilexer'],
+    install_requires=(
+        'sphinx >= 1.0.7',
+        'sphinxcontrib-phpdomain >= 0.1.3-1'
+    ),
+    entry_points=entry_points
+)
diff --git a/user_guide_src/source/_themes/eldocs/layout.html b/user_guide_src/source/_themes/eldocs/layout.html
new file mode 100644
index 0000000..4e083a1
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/layout.html
@@ -0,0 +1,164 @@
+{%- block doctype -%}
+<!DOCTYPE html>
+{%- endblock %}
+{%- set reldelim1 = reldelim1 is not defined and ' &rsaquo;' or reldelim1 %}
+{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
+{%- set url_root = pathto('', 1) %}
+{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
+{% set project_abbreviation = 'ee' %}{% set project_domain = 'expressionengine.com' %}
+{%- if project == 'ExpressionEngine' %}{% set project_abbreviation = 'ee' %}{% set project_domain = 'expressionengine.com' %}{% endif -%}
+{%- if project == 'CodeIgniter' %}{% set project_abbreviation = 'ci' %}{% set project_domain = 'codeigniter.com' %}{% endif -%}
+{%- if project == 'MojoMotor' %}{% set project_abbreviation = 'mm' %}{% set project_domain = 'mojomotor.com' %}{% endif -%}
+
+<html>
+	<head>
+		<meta charset="{{ encoding }}">
+	    {{ metatags }}
+	    {%- if not embedded and docstitle %}
+	      {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
+	    {%- else %}
+	      {%- set titlesuffix = "" %}
+	    {%- endif %}
+	    {%- block htmltitle %}
+	    <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
+	    {%- endblock %}
+
+	    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
+	    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
+	    {%- for cssfile in css_files %}
+	    <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
+	    {%- endfor %}
+	
+    {%- if not embedded %}
+	    <script type="text/javascript">
+	      var DOCUMENTATION_OPTIONS = {
+	        URL_ROOT:    '{{ url_root }}',
+	        VERSION:     '{{ release|e }}',
+	        COLLAPSE_INDEX: false,
+	        FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
+	        HAS_SOURCE:  {{ has_source|lower }}
+	      };
+	    </script>
+	    {%- for scriptfile in script_files %}
+	    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
+	    {%- endfor %}
+
+	    {%- if favicon %}
+	    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
+	    {%- endif %}
+	{%- endif %}
+	
+	{%- block linktags %}
+	    {%- if hasdoc('about') %}
+	    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
+	    {%- endif %}
+	    {%- if hasdoc('genindex') %}
+	    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
+	    {%- endif %}
+	    {%- if hasdoc('search') %}
+	    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
+	    {%- endif %}
+	    {%- if hasdoc('copyright') %}
+	    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
+	    {%- endif %}
+	    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
+	    {%- if parents %}
+	    <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
+	    {%- endif %}
+	    {%- if next %}
+	    <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
+	    {%- endif %}
+	    {%- if prev %}
+	    <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
+	    {%- endif %}
+	{%- endblock %}
+		{%- block extrahead %} {% endblock %}
+	</head>
+	<body>
+	{%- block content %}
+		<div id="table-contents">
+			<div class="toctree-wrapper compound">
+			{{ toctree(collapse=true) }}
+			</div>
+		</div>
+
+		<div id="brand" class="{{ project_abbreviation }}">
+			<a href="http://{{ project_domain }}/"><img src="{{ pathto('_static/asset/img/' + project_abbreviation + '-logo.gif', 1) }}" alt="{{ project }}"></a>
+			<p>{{ version }} User Guide</p>
+			{%- if show_source and has_source and sourcename %}
+		    <p><a href="{{ pathto('_sources/' + sourcename, true)|e }}"
+			           rel="nofollow">{{ _('Show Source') }}</a></p>
+			{%- endif %}
+		</div><!-- /#brand -->
+
+		<div id="header">
+			<form method="get" action="http://www.google.com/search">
+				<fieldset>
+					<input type="text" name="q" id="q" value="">
+					<input type="hidden" name="as_sitesearch" id="as_sitesearch" value="{{ project_domain }}/user_guide/" />
+					<input class="grades" type="submit" value="search">
+				</fieldset>
+			</form>
+			<ul>
+				{%- block rootrellink %}
+				<li><a href="{{ pathto(master_doc) }}">Home</a>&nbsp;&nbsp;{{ reldelim1 }}</li>
+				<li><a id="toc-link" href="{{ pathto(master_doc) }}">Table of Contents</a>&nbsp;&nbsp;{{ reldelim1 }}</li>
+				{%- endblock %}
+				
+				{%- for parent in parents %}
+				<li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>&nbsp;&nbsp; {{ reldelim1 }}</li>
+		        {%- endfor %}
+
+				<li><strong>{{ title }}</strong></li>
+			</ul>
+		</div><!-- /#header -->
+
+		<div class="section" id="content">
+			{{ body }}
+		</div>
+	{%- endblock %}
+
+		{% if pagename not in exclude_comments -%}
+		<!-- {user_guide_comments} -->
+		{% endif %}
+	
+	{%- block footer %}			
+		<div id="footer">
+			<p class="top"><a href="#header" title="Return to top">Return to top</a></p>
+			<p><a href="{{ project_url }}">{{ project }}</a> &ndash; Copyright &copy; {{ copyright }}</a></p>
+		</div><!-- /#footer -->
+	{%- endblock %}
+	
+	<script src="{{ pathto('_static/asset/js/jquery-ui-min.js', 1) }}" type="text/javascript" charset="utf-8" async></script>
+	<script type="text/javascript" charset="utf-8">
+		$('#toc-link').click(function(){
+			$('#table-contents').animate({ left: '0' },1000);
+			return false;
+		});
+		$('html').click(function(){
+			if ($('#table-contents').css("left") == '0px'){
+				$('#table-contents').animate({ left: '-520' },1000);
+			}
+		});
+		$('#table-contents').click(function(event){
+			event.stopPropagation();
+		});
+/*		$('*:not(#table-contents,#toc-link)').click(function(){
+			if ($('#table-contents').css("left") == '0px'){
+				$('#table-contents').animate({ left: '-520' },1000);
+			}
+		});
+/*		$("#toc-link").click(function () {
+			$('#table-contents').show("slide", { direction: "left" }, 100);
+			event.stopPropagation();
+			return false;
+		});
+		$('*:not(#table-contents,#toc-link)').click(function () {
+			if ($('#table-contents').is(":visible")) {
+				$('#table-contents').hide("slide", { direction: "left" }, 100);
+				event.stopPropagation();	
+			}
+		}); */
+	</script>
+	</body>
+</html>
\ No newline at end of file
diff --git a/user_guide_src/source/_themes/eldocs/static/asset/css/common.css b/user_guide_src/source/_themes/eldocs/static/asset/css/common.css
new file mode 100644
index 0000000..c216c36
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/asset/css/common.css
@@ -0,0 +1,289 @@
+html, body,
+h1, h2, h3, h4, h5, h6,
+p, ul, ol, li, dl, dd, dt, pre, form, fieldset{ margin: 0; padding: 0; } 
+
+body{ background-color: #F9F9F9; color: #444444; font: normal normal 14px "Helvetica", "Arial", Sans-Serif; }
+
+pre, kbd, var, samp, tt{ font-family: "Courier", Monospace; }
+
+pre,
+#header,
+#footer,
+#table-contents .toctree-wrapper{ font-size: 12px; }
+
+dfn, var,
+em.dfn, em.var{ 
+	background-color: #FFFDED; 
+	color: #578236; 
+	font-style: italic; 
+	padding: 3px;
+}
+
+kbd, samp{ color: #B83044; }
+
+	kbd{ font-style: italic; }
+
+h1, h2, h3, h4, h5, h6, pre{ color: #094776; }
+
+h1{ font-size: 28px; }
+
+h2{ font-size: 24px; }
+
+h2, h3{ border-bottom: 2px solid #EEEEEE; padding: 0 0 3px; }	
+
+h3{ border-color: #E5E5E5; border-width: 1px; }
+
+h4{ background-color: #FFFDED; display: inline-block; font-size: 18px; margin: 0; padding: 5px; }
+
+	h1 a, h2 a{ font-weight: normal; }
+
+	h1 a, h2 a, h3 a{ text-decoration: none; }
+	
+h3, h5, h6{ font-size: 18px; margin: 20px 0; }
+
+	h4, h5, h6{ font-size: 14px; }
+
+p, dl, ul, ol{ margin: 20px 0; }
+
+	p, dl, ul, ol, h3, h4, h5, h6{ margin-left: 20px; }
+
+	li > ul,
+	li > ol{ margin: 0; margin-left: 40px; }
+
+	dl > dd{ margin-left: 20px; }
+
+p, li, dd, dt, pre{ line-height: 1.5; }
+
+table{ 
+	background-color: #F5FBFF;
+	border: 1px solid #C8DEF0;
+	border-collapse: collapse;
+	margin-bottom: 20px;
+}
+
+	th, td{ 
+		border: 0; 
+		border-bottom: 1px solid #C8DEF0;
+		padding: 8px; 
+	}
+	
+		th{ 
+			background-color: #326B95; 
+			color: #FFFFFF;
+			text-align: left; 
+		}
+	
+		td{ font-size: 12px; }
+
+	.descname{ color: #000080; font-weight: bold; }
+	.descclassname{ color: #094776; }
+	
+	.class .descname{ font-size: 18px; font-style: italic; }
+	.method .descname{ font-style: normal; }
+	
+	.class .property{ color: #094776; }
+	
+	.method big,
+	.method .optional{ color: #094776; padding: 0 4px 0 6px; }
+	
+	.class em,
+	.method em{ color: #008080; }
+	
+	.method dt{ margin: 20px 0; }
+		
+	.method table{ margin-bottom: 0; margin-left: 20px; }
+	
+	.method th,
+	.method td{ padding: 10px; }
+	
+	.method td > ul{ margin: 0; margin-left: 20px; }
+	.method td.field-body > p { margin: 0; margin-left: 20px; }
+
+a:link,
+a:visited{ color: #1A5B8D; }
+
+a:hover,
+a:active{ color: #742CAC; }
+
+a.headerlink{ visibility: hidden; }
+
+	:hover > a.headerlink { visibility: visible; }
+
+a img{ 
+	border: 0;
+	outline: 0;
+}
+
+img{ display: block; max-width: 100%; }
+
+fieldset{ border: 0; }
+
+.top{ float: right; }
+
+.highlight-ci,
+.highlight-ee,
+.highlight-rst,
+.highlight-bash,
+.highlight-perl,
+.cp-path,
+.important,
+.note{ 
+	background-color: #F5FBFF; 
+	border: 1px solid #C8DEF0; 
+	margin: 20px 0 20px 20px; 
+	padding: 10px 10px 8px; 
+}
+
+	.highlight-ci,
+	.highlight-ee,
+	.highlight-rst,
+	.highlight-bash,
+	.highlight-perl{
+		-moz-box-shadow: 4px 4px 0 rgba(0,0,0,0.03);
+		-webkit-box-shadow: 4px 4px 0 rgba(0,0,0,0.03);
+		box-shadow: 4px 4px 0 rgba(0,0,0,0.03);
+	}
+
+	.cp-path{ background-color: #FFFDED; border-color: #D1CDB0; }
+	.important, .note{ background-color: #F2FFE8; border-color: #B9D3A6; }
+	.highlight-rst{ background-color: #F9FEFE; border-color: #AACFCF; }
+	
+	.important p,
+	.note p{ margin: 0; }
+	
+.admonition-title{ 
+	float: left;
+	font-weight: bold;  
+	padding-right: 4px; 
+	text-transform: uppercase; 
+}
+
+.admonition-title:after{ content: ':  '; }
+	
+#table-contents{
+	bottom: 0;
+	left: -520px;
+	position: fixed;
+	top: 0;
+}
+
+#table-contents .toctree-wrapper{ 
+	background-color: #444444;
+	background-color: rgba(0,0,0,0.9);
+	*+background-color: #444444;
+	bottom: 0;
+	left: 0;
+	overflow-y: auto;
+	padding: 20px 10px;
+	position: absolute;
+	top: 0;
+	width: 500px;
+}
+
+	#table-contents .toctree-wrapper ul{margin-bottom: 0; margin-top: 0; }
+	
+		#table-contents .toctree-wrapper li{ color: #999999; line-height: 1.7; padding: 1px 0; }
+		
+			#table-contents .toctree-l1{ list-style-type: none; }
+		
+			#table-contents .toctree-l1 > a{ 
+				background: transparent url(../../asset/img/paper-ico.gif) no-repeat 0 0; 
+				font-size: 14px; 
+				font-weight: bold;
+				padding-left: 20px; 
+			}
+
+	#header a:link,
+	#header a:visited,
+	#table-contents .toctree-wrapper a:link,
+	#table-contents .toctree-wrapper a:visited{ color: #FFFFFF; }
+
+	#header a:hover,
+	#header a:active,
+	#table-contents .toctree-wrapper a:hover,
+	#table-contents .toctree-wrapper a:active{ color: #FFF8C3; }
+
+#content{ background-color: #FFFFFF; padding: 40px 40px 20px; }
+
+#brand{ 
+	background-color: #F5F5F5; 
+	color: #FFFFFF; 
+	overflow: hidden;
+	padding: 10px 20px 13px; 
+}
+
+	#brand > *{ float: left; }
+	
+	#brand p{ font-size: 14px; margin: 2px 0 0 5px; }
+	#brand.ci p{ margin-top: 8px; }
+
+	#brand.ee{ background-color: #27343C; }
+	#brand.ci{ background-color: #4A0202; }
+	#brand.mm{ background-color: #222627; }
+	#brand.el{ background-color: #4A0202; }
+
+#header{ 
+	background-color: #3B7EB0;
+	border-top: 2px solid #539ECC;
+	color: #FFFFFF; 
+	overflow: hidden; 
+	padding: 15px 15px 16px 20px; 
+}
+
+	#header form{ float: right; overflow: hidden; }
+	
+	#header input{ float: left; }
+	
+	#header input[type="text"]{
+		background-color: #FFFFFF;
+		border: 1px solid;
+		border-color: #033861 #13598F #13598F #033861;
+		font-size: inherit;
+		margin-right: 5px;
+		padding: 5px;
+		width: 175px;
+	}
+	
+		#header input[type="text"]:focus{ background-color: #FFFDED; outline: 0; }
+		
+	#header input[type="submit"]{
+		background: #F0F9FF url(../../asset/img/grades.gif) repeat-x 0 -58px;
+		border: 1px solid #033861;
+		color: #094776;
+		cursor: pointer;
+		font-weight: bold;
+		padding: 5px 10px 4px;
+		text-transform: uppercase;
+	}
+	
+		#header input[type="submit"]:hover{ background-position: 0 -83px; }
+	
+	#header ul{ 
+		float: left;
+		list-style-type: none;
+		margin: 0; 
+		overflow: hidden;
+	}
+	
+		#header li{ float: left; margin: 4px 5px 0 0; }
+		
+#footer{ background-color: #F9F9F9; border-top: 1px solid #CCCCCC; padding: 20px; }
+
+	#footer p{ margin: 0; }
+
+@media (max-width:800px){
+	#footer .top,
+	#header form{ float: none; margin-bottom: 10px; }
+	#content{ padding: 20px; }
+}
+
+@media (max-width:340px){
+	body{ font-size: 12px; }
+	h1{ font-size: 18px; }
+	h2{ font-size: 16px; }
+	h3,h4,h5,h6{ font-size: 14px; }
+}
+
+@media screen and (-webkit-min-device-pixel-ratio:0){
+	#header input[type="submit"]{ padding-bottom: 7px; }
+}
\ No newline at end of file
diff --git a/user_guide_src/source/_themes/eldocs/static/asset/img/ci-logo.gif b/user_guide_src/source/_themes/eldocs/static/asset/img/ci-logo.gif
new file mode 100644
index 0000000..ca22523
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/asset/img/ci-logo.gif
Binary files differ
diff --git a/user_guide_src/source/_themes/eldocs/static/asset/img/ee-logo.gif b/user_guide_src/source/_themes/eldocs/static/asset/img/ee-logo.gif
new file mode 100644
index 0000000..9867294
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/asset/img/ee-logo.gif
Binary files differ
diff --git a/user_guide_src/source/_themes/eldocs/static/asset/img/grades.gif b/user_guide_src/source/_themes/eldocs/static/asset/img/grades.gif
new file mode 100644
index 0000000..2b37967
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/asset/img/grades.gif
Binary files differ
diff --git a/user_guide_src/source/_themes/eldocs/static/asset/img/mm-logo.gif b/user_guide_src/source/_themes/eldocs/static/asset/img/mm-logo.gif
new file mode 100644
index 0000000..7cb07f0
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/asset/img/mm-logo.gif
Binary files differ
diff --git a/user_guide_src/source/_themes/eldocs/static/asset/img/paper-ico.gif b/user_guide_src/source/_themes/eldocs/static/asset/img/paper-ico.gif
new file mode 100644
index 0000000..5fc1994
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/asset/img/paper-ico.gif
Binary files differ
diff --git a/user_guide_src/source/_themes/eldocs/static/asset/js/jquery-ui-min.js b/user_guide_src/source/_themes/eldocs/static/asset/js/jquery-ui-min.js
new file mode 100755
index 0000000..f9e4f1e
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/asset/js/jquery-ui-min.js
@@ -0,0 +1,789 @@
+/*!
+ * jQuery UI 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.14",
+keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();
+b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,
+"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",
+function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,
+outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,"tabindex"),d=isNaN(b);
+return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=
+0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*!
+ * jQuery UI Mouse 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function(b){var d=false;b(document).mousedown(function(){d=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+
+this.widgetName)},_mouseDown:function(a){if(!d){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,f=a.which==1,g=typeof this.options.cancel=="string"?b(a.target).closest(this.options.cancel).length:false;if(!f||g||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==
+false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(e){return c._mouseMove(e)};this._mouseUpDelegate=function(e){return c._mouseUp(e)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return d=true}},_mouseMove:function(a){if(b.browser.msie&&
+!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=
+false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+;/*
+ * jQuery UI Position 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
+m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
+d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
+;/*
+ * jQuery UI Draggable 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options;this.helper=
+this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});
+this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true},
+_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=
+false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,
+10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||
+!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&
+a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
+this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
+10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),
+10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,
+(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!=
+"hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),
+10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+
+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&
+!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.left<g[0])e=g[0]+this.offset.click.left;
+if(a.pageY-this.offset.click.top<g[1])h=g[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>g[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.top<g[1]||h-this.offset.click.top>g[3])?h:!(h-this.offset.click.top<g[1])?h-b.grid[1]:h+b.grid[1]:h;e=b.grid[0]?this.originalPageX+Math.round((e-this.originalPageX)/
+b.grid[0])*b.grid[0]:this.originalPageX;e=g?!(e-this.offset.click.left<g[0]||e-this.offset.click.left>g[2])?e:!(e-this.offset.click.left<g[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<
+526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,
+c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.14"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var h=d.data(this,"sortable");if(h&&!h.options.disabled){c.sortables.push({instance:h,shouldRevert:h.options.revert});
+h.refreshPositions();h._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=
+false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",true);
+this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;
+c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&
+this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=
+a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!=
+"x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<
+c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-
+c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,
+width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,h=b.offset.left,g=h+c.helperProportions.width,n=b.offset.top,o=n+c.helperProportions.height,i=c.snapElements.length-1;i>=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e<h&&h<l+e&&k-e<n&&n<m+e||j-e<h&&h<l+e&&k-e<o&&o<m+e||j-e<g&&g<l+e&&k-e<n&&n<m+e||j-e<g&&g<l+e&&k-e<o&&
+o<m+e){if(f.snapMode!="inner"){var p=Math.abs(k-o)<=e,q=Math.abs(m-n)<=e,r=Math.abs(j-g)<=e,s=Math.abs(l-h)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:m,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l}).left-c.margins.left}var t=
+p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(k-n)<=e;q=Math.abs(m-o)<=e;r=Math.abs(j-h)<=e;s=Math.abs(l-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:m-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[i].snapping&&
+(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=p||q||r||s||t}else{c.snapElements[i].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),
+10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
+;/*
+ * jQuery UI Droppable 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.14"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){e=="mousedown"&&c[f]._activate.call(c[f],b);c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight}}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},dragStart:function(a,b){a.element.parentsUntil("body").bind("scroll.droppable",function(){a.options.refreshPositions||d.ui.ddmanager.prepareOffsets(a,b)})},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=
+!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})},dragStop:function(a,b){a.element.parentsUntil("body").unbind("scroll.droppable");
+a.options.refreshPositions||d.ui.ddmanager.prepareOffsets(a,b)}}})(jQuery);
+;/*
+ * jQuery UI Resizable 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();
+var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=
+false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});
+this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff=
+{width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];
+if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},
+_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,
+{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(b){var a=this.options,c,d,f;a={minWidth:k(a.minWidth)?a.minWidth:0,maxWidth:k(a.maxWidth)?a.maxWidth:Infinity,minHeight:k(a.minHeight)?a.minHeight:0,maxHeight:k(a.maxHeight)?a.maxHeight:
+Infinity};if(this._aspectRatio||b){b=a.minHeight*this.aspectRatio;d=a.minWidth/this.aspectRatio;c=a.maxHeight*this.aspectRatio;f=a.maxWidth/this.aspectRatio;if(b>a.minWidth)a.minWidth=b;if(d>a.minHeight)a.minHeight=d;if(c<a.maxWidth)a.maxWidth=c;if(f<a.maxHeight)a.maxHeight=f}this._vBoundaries=a},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=
+b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(k(b.height))b.width=b.height*this.aspectRatio;else if(k(b.width))b.height=b.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this._vBoundaries,c=this.axis,d=k(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=k(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=k(b.width)&&a.minWidth&&
+a.minWidth>b.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&l)b.left=i-a.minWidth;if(d&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=
+null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||
+0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+
+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+
+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);
+b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.14"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),
+10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-
+f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var l=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:l.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(l.css("position"))){c._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?
+e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=
+e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,
+step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=
+e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;
+var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:
+a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-
+d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,
+f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,
+display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=
+e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=
+d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
+;/*
+ * jQuery UI Selectable 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.14"})})(jQuery);
+;/*
+ * jQuery UI Sortable 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a===
+"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&
+!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,
+left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=
+document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);
+return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<
+b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-
+b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,
+a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],
+e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();
+c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):
+this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,
+dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},
+toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
+this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();
+var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},
+_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();
+if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
+this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),
+this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&
+this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=
+this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=
+d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||
+0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",
+a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-
+f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=
+this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==
+""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=
+this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a=
+{top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),
+10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
+10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=
+this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&
+this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();
+var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-
+this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-
+this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],
+this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]=
+"";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",
+f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,
+this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",
+a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},
+_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.14"})})(jQuery);
+;/*
+ * jQuery UI Accordion 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a=
+this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
+e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
+e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
+"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.14",
+animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);
+f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",
+paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
+;/*
+ * jQuery UI Autocomplete 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g=
+false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=
+a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};
+this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&
+a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
+d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&
+b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=
+this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();
+this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||
+b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new d.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;
+d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
+(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");
+this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,
+this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||
+this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||
+this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[d.fn.prop?"prop":"attr"]("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
+;/*
+ * jQuery UI Button 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(b){var h,i,j,g,l=function(){var a=b(this).find(":ui-button");setTimeout(function(){a.button("refresh")},1)},k=function(a){var c=a.name,e=a.form,f=b([]);if(c)f=e?b(e).find("[name='"+c+"']"):b("[name='"+c+"']",a.ownerDocument).filter(function(){return!this.form});return f};b.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",l);if(typeof this.options.disabled!==
+"boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var a=this,c=this.options,e=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!e?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",function(){if(!c.disabled){b(this).addClass("ui-state-hover");
+this===h&&b(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||b(this).removeClass(f)}).bind("click.button",function(d){if(c.disabled){d.preventDefault();d.stopImmediatePropagation()}});this.element.bind("focus.button",function(){a.buttonElement.addClass("ui-state-focus")}).bind("blur.button",function(){a.buttonElement.removeClass("ui-state-focus")});if(e){this.element.bind("change.button",function(){g||a.refresh()});this.buttonElement.bind("mousedown.button",function(d){if(!c.disabled){g=
+false;i=d.pageX;j=d.pageY}}).bind("mouseup.button",function(d){if(!c.disabled)if(i!==d.pageX||j!==d.pageY)g=true})}if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled||g)return false;b(this).toggleClass("ui-state-active");a.buttonElement.attr("aria-pressed",a.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled||g)return false;b(this).addClass("ui-state-active");a.buttonElement.attr("aria-pressed",true);
+var d=a.element[0];k(d).not(d).map(function(){return b(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;b(this).addClass("ui-state-active");h=this;b(document).one("mouseup",function(){h=null})}).bind("mouseup.button",function(){if(c.disabled)return false;b(this).removeClass("ui-state-active")}).bind("keydown.button",function(d){if(c.disabled)return false;if(d.keyCode==b.ui.keyCode.SPACE||
+d.keyCode==b.ui.keyCode.ENTER)b(this).addClass("ui-state-active")}).bind("keyup.button",function(){b(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(d){d.keyCode===b.ui.keyCode.SPACE&&b(this).click()})}this._setOption("disabled",c.disabled);this._resetButton()},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type===
+"radio"){var a=this.element.parents().filter(":last"),c="label[for="+this.element.attr("id")+"]";this.buttonElement=a.find(c);if(!this.buttonElement.length){a=a.length?a.siblings():this.element.siblings();this.buttonElement=a.filter(c);if(!this.buttonElement.length)this.buttonElement=a.find(c)}this.element.addClass("ui-helper-hidden-accessible");(a=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",a)}else this.buttonElement=this.element},
+widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||this.buttonElement.removeAttr("title");
+b.Widget.prototype.destroy.call(this)},_setOption:function(a,c){b.Widget.prototype._setOption.apply(this,arguments);if(a==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");else this._resetButton()},refresh:function(){var a=this.element.is(":disabled");a!==this.options.disabled&&this._setOption("disabled",a);if(this.type==="radio")k(this.element[0]).each(function(){b(this).is(":checked")?b(this).button("widget").addClass("ui-state-active").attr("aria-pressed",true):
+b(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var a=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=b("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(a.empty()).text(),e=this.options.icons,f=e.primary&&e.secondary,d=[];if(e.primary||e.secondary){if(this.options.text)d.push("ui-button-text-icon"+(f?"s":e.primary?"-primary":"-secondary"));e.primary&&a.prepend("<span class='ui-button-icon-primary ui-icon "+e.primary+"'></span>");e.secondary&&a.append("<span class='ui-button-icon-secondary ui-icon "+e.secondary+"'></span>");if(!this.options.text){d.push(f?"ui-button-icons-only":
+"ui-button-icon-only");this.hasTitle||a.attr("title",c)}}else d.push("ui-button-text-only");a.addClass(d.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(a,c){a==="disabled"&&this.buttons.button("option",a,c);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var a=this.element.css("direction")===
+"ltr";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(a?"ui-corner-left":"ui-corner-right").end().filter(":last").addClass(a?"ui-corner-right":"ui-corner-left").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");
+b.Widget.prototype.destroy.call(this)}})})(jQuery);
+;/*
+ * jQuery UI Dialog 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,
+position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+
+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),
+h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",
+e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");
+a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==
+b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=
+1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===
+f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,
+function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('<button type="button"></button>').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",
+handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,
+originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",
+f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):
+[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);
+if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):
+e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=
+this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-
+b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.14",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),
+create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=
+a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+;/*
+ * jQuery UI Slider 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options,c=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f=a.values&&a.values.length||1,e=[];this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+
+this.orientation+" ui-widget ui-widget-content ui-corner-all"+(a.disabled?" ui-slider-disabled ui-disabled":""));this.range=d([]);if(a.range){if(a.range===true){if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}this.range=d("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(a.range==="min"||a.range==="max"?" ui-slider-range-"+a.range:""))}for(var j=c.length;j<f;j+=1)e.push("<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>");
+this.handles=c.add(d(e.join("")).appendTo(b.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle",
+g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!b.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");i=b._start(g,l);if(i===false)return}break}m=b.options.step;i=b.options.values&&b.options.values.length?
+(h=b.values(l)):(h=b.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=b._valueMin();break;case d.ui.keyCode.END:h=b._valueMax();break;case d.ui.keyCode.PAGE_UP:h=b._trimAlignValue(i+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=b._trimAlignValue(i-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===b._valueMax())return;h=b._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===b._valueMin())return;h=b._trimAlignValue(i-
+m);break}b._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(g,k);b._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy();
+return this},_mouseCapture:function(b){var a=this.options,c,f,e,j,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(a.range===true&&this.values(1)===a.min){g+=1;e=d(this.handles[g])}if(this._start(b,g)===false)return false;
+this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();a=e.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-e.width()/2,top:b.pageY-a.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(b){var a=
+this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;if(this.orientation==="horizontal"){a=
+this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);
+c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var f;if(this.options.values&&this.options.values.length){f=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>f||a===1&&c<f))c=f;if(c!==this.values(a)){f=this.values();f[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:f});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a],value:c});
+b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value=
+this._trimAlignValue(b);this._refreshValue();this._change(null,0)}else return this._value()},values:function(b,a){var c,f,e;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e<c.length;e+=1){c[e]=this._trimAlignValue(f[e]);this._change(null,e)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):
+this.value();else return this._values()},_setOption:function(b,a){var c,f=0;if(d.isArray(this.options.values))f=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<f;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b];
+return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var b=this.options.range,a=this.options,c=this,f=!this._animateOff?a.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},a.animate);
+if(h===1)c.range[f?"animate":"css"]({width:e-g+"%"},{queue:false,duration:a.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},a.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:a.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[f?"animate":"css"]({width:e+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.14"})})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.14"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+;/*
+ * jQuery UI Datepicker 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function(d,C){function M(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=N(d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function N(a){return a.bind("mouseout",function(b){b=
+d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");b.addClass("ui-state-hover");
+b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.14"}});var A=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){H(this._defaults,
+a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,
+selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=
+h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=
+this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,
+"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",
+function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);
+a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",
+this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",
+this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=
+b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",
+cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},
+_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,
+"max");H(e.settings,f);if(i!==null&&f.dateFormat!==C&&f.minDate===C)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==C&&f.maxDate===C)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDate(e,h);this._updateAlternate(e);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,
+b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);
+c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);
+c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||
+a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=
+d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==C?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);
+d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=
+d.datepicker._get(b,"beforeShow");H(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c=
+{left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");
+if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);
+J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");
+a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||
+c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+
+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=
+this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",
+left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&
+d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=
+b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=
+!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);
+a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));
+d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%
+100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=B+1<a.length&&a.charAt(B+1)==p)&&B++;return p},m=function(p){var D=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&D?4:p=="o"?3:2)+"}");p=b.substring(q).match(p);if(!p)throw"Missing number at position "+q;q+=
+p[0].length;return parseInt(p[0],10)},n=function(p,D,K){p=d.map(o(p)?K:D,function(w,x){return[[x,w]]}).sort(function(w,x){return-(w[1].length-x[1].length)});var E=-1;d.each(p,function(w,x){w=x[1];if(b.substr(q,w.length).toLowerCase()==w.toLowerCase()){E=x[0];q+=w.length;return false}});if(E!=-1)return E+1;else throw"Unknown name at position "+q;},s=function(){if(b.charAt(q)!=a.charAt(B))throw"Unexpected literal at position "+q;q++},q=0,B=0;B<a.length;B++)if(k)if(a.charAt(B)=="'"&&!o("'"))k=false;
+else s();else switch(a.charAt(B)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "'":if(o("'"))s();else k=true;break;default:s()}if(q<b.length)throw"Extra/unparsed characters found in date: "+b.substring(q);
+if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",
+TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<
+n;)m="0"+m;return m},j=function(o,m,n,s){return i(o)?s[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5),3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",b.getMonth(),h,
+c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+=
+"0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==C?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=
+f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=
+(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,
+l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=
+a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),
+b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=
+this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+A+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+A+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+s+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"w":"e")+'">'+s+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+A+'.datepicker._hideDatepicker();">'+this._get(a,
+"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,s)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+A+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),B=
+this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x<i[0];x++){var O="";this.maxRows=4;for(var G=0;G<i[1];G++){var P=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",y="";if(l){y+='<div class="ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":
+"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,B,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var z=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":
+"";for(t=0;t<7;t++){var r=(t+h)%7;z+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+s[r]+'">'+q[r]+"</span></th>"}y+=z+"</tr></thead><tbody>";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q<z;Q++){y+="<tr>";var R=!j?"":'<td class="ui-datepicker-week-col">'+
+this._get(a,"calculateWeek")(r)+"</td>";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&r<k||o&&r>o;R+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(r.getTime()==P.getTime()&&g==a.selectedMonth&&a._keyEvent||E.getTime()==r.getTime()&&E.getTime()==P.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!D?"":" "+I[1]+(r.getTime()==u.getTime()?" "+
+this._currentClass:"")+(r.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!F||D)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+A+".datepicker._selectDay('#"+a.id+"',"+r.getMonth()+","+r.getFullYear()+', this);return false;"')+">"+(F&&!D?"&#xa0;":L?'<span class="ui-state-default">'+r.getDate()+"</span>":'<a class="ui-state-default'+(r.getTime()==b.getTime()?" ui-state-highlight":"")+(r.getTime()==u.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+
+r.getDate()+"</a>")+"</td>";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+"</tr>"}g++;if(g>11){g=0;m++}y+="</tbody></table>"+(l?"</div>"+(i[0]>0&&G==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),
+l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+A+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+A+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+
+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&l)?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):
+g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+A+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+A+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c==
+"Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");
+if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
+c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
+function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,
+[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.14";window["DP_jQuery_"+A]=d})(jQuery);
+;/*
+ * jQuery UI Progressbar 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.14"})})(jQuery);
+;/*
+ * jQuery UI Effects 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
+d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})};
+f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,
+[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.14",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=
+0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});
+c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,
+a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);
+a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%",
+"pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*
+((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=
+e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=
+e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/
+h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*
+h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,
+e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
+;/*
+ * jQuery UI Effects Blind 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
+g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Bounce 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Clip 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
+c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Drop 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
+"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Explode 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
+;/*
+ * jQuery UI Effects Fade 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Fold 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
+10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Highlight 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Pulsate 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Scale 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
+if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
+a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
+child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
+n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Shake 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
+(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Slide 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
+var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Transfer 1.8.14
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
+;
\ No newline at end of file
diff --git a/user_guide_src/source/_themes/eldocs/static/jquery.js b/user_guide_src/source/_themes/eldocs/static/jquery.js
new file mode 100644
index 0000000..8cdc80e
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/jquery.js
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
+shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
+)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
\ No newline at end of file
diff --git a/user_guide_src/source/_themes/eldocs/static/pygments.css b/user_guide_src/source/_themes/eldocs/static/pygments.css
new file mode 100644
index 0000000..99f6a85
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/static/pygments.css
@@ -0,0 +1,60 @@
+.highlight .hll { background-color: #ffffcc }
+.highlight  { background: inherit; }
+.highlight .c { color: #999988; font-style: italic } /* Comment */
+.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
+.highlight .k { font-weight: bold } /* Keyword */
+.highlight .o { font-weight: bold } /* Operator */
+.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
+.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #aa0000 } /* Generic.Error */
+.highlight .gh { color: #999999 } /* Generic.Heading */
+.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
+.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gp { color: #555555 } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
+.highlight .gt { color: #aa0000 } /* Generic.Traceback */
+.highlight .kc { font-weight: bold } /* Keyword.Constant */
+.highlight .kd { font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
+.highlight .m { color: #009999 } /* Literal.Number */
+.highlight .s { color: #bb8844 } /* Literal.String */
+.highlight .na { color: #008080 } /* Name.Attribute */
+.highlight .nb { color: #999999 } /* Name.Builtin */
+.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
+.highlight .no { color: #008080 } /* Name.Constant */
+.highlight .ni { color: #800080 } /* Name.Entity */
+.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #000080; font-weight: bold } /* Name.Function */
+.highlight .nn { color: #555555 } /* Name.Namespace */
+.highlight .nt { color: #000080 } /* Name.Tag */
+.highlight .nv { color: #008080 } /* Name.Variable */
+.highlight .ow { font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mf { color: #009999 } /* Literal.Number.Float */
+.highlight .mh { color: #009999 } /* Literal.Number.Hex */
+.highlight .mi { color: #009999 } /* Literal.Number.Integer */
+.highlight .mo { color: #009999 } /* Literal.Number.Oct */
+.highlight .sb { color: #bb8844 } /* Literal.String.Backtick */
+.highlight .sc { color: #bb8844 } /* Literal.String.Char */
+.highlight .sd { color: #bb8844 } /* Literal.String.Doc */
+.highlight .s2 { color: #bb8844 } /* Literal.String.Double */
+.highlight .se { color: #bb8844 } /* Literal.String.Escape */
+.highlight .sh { color: #bb8844 } /* Literal.String.Heredoc */
+.highlight .si { color: #bb8844 } /* Literal.String.Interpol */
+.highlight .sx { color: #bb8844 } /* Literal.String.Other */
+.highlight .sr { color: #808000 } /* Literal.String.Regex */
+.highlight .s1 { color: #bb8844 } /* Literal.String.Single */
+.highlight .ss { color: #bb8844 } /* Literal.String.Symbol */
+.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #008080 } /* Name.Variable.Class */
+.highlight .vg { color: #008080 } /* Name.Variable.Global */
+.highlight .vi { color: #008080 } /* Name.Variable.Instance */
+.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/user_guide_src/source/_themes/eldocs/theme.conf b/user_guide_src/source/_themes/eldocs/theme.conf
new file mode 100644
index 0000000..609e74d
--- /dev/null
+++ b/user_guide_src/source/_themes/eldocs/theme.conf
@@ -0,0 +1,3 @@
+[theme]
+inherit = basic
+stylesheet = asset/css/common.css
\ No newline at end of file
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
new file mode 100644
index 0000000..e94e87e
--- /dev/null
+++ b/user_guide_src/source/changelog.rst
@@ -0,0 +1,2177 @@
+##########
+Change Log
+##########
+
+Version 2.1.0 (planned)
+=======================
+
+Release Date: Not Released
+
+-  General Changes
+
+   -  Added Android to the list of user agents.
+   -  Added Windows 7 to the list of user platforms.
+   -  Callback validation rules can now accept parameters like any other
+      validation rule.
+   -  Ability to log certain error types, not all under a threshold.
+   -  Added html_escape() to :doc:`Common
+      functions <general/common_functions>` to escape HTML output
+      for preventing XSS.
+   -  Added support for pem,p10,p12,p7a,p7c,p7m,p7r,p7s,crt,crl,der,kdb,rsa,cer,sst,csr Certs to mimes.php.
+   -  Added support pgp,gpg to mimes.php.
+   -  Added support 3gp, 3g2, mp4, wmv, f4v, vlc Video files to mimes.php.
+   -  Added support m4a, aac, m4u, xspf, au, ac3, flac, ogg Audio files to mimes.php.
+
+-  Helpers
+
+   -  Added increment_string() to :doc:`String
+      Helper <helpers/string_helper>` to turn "foo" into "foo-1"
+      or "foo-1" into "foo-2".
+   -  Altered form helper - made action on form_open_multipart helper
+      function call optional. Fixes (#65)
+   -  url_title() will now trim extra dashes from beginning and end.
+   -  Improved speed of <a href="helpers/string_helper.html">String Helper</a>'s <b>random_string()</b> method
+   -  Added XHTML Basic 1.1 doctype to <a href="helpers/html_helper.html">HTML Helper</a>.
+
+-  Database
+
+   -  Added a `CUBRID <http://www.cubrid.org/>`_ driver to the `Database
+      Driver <database/index>`. Thanks to the CUBRID team for
+      supplying this patch.
+   -  Added a PDO driver to the <a href="database/index.html">Database Driver</a>.
+   -  Typecast limit and offset in the :doc:`Database
+      Driver <database/queries>` to integers to avoid possible
+      injection.
+   -  Added additional option 'none' for the optional third argument for
+      $this->db->like() in the :doc:`Database
+      Driver <database/active_record>`.
+   -  Added <kbd>$this->db->insert_batch()</kbd> support to the OCI8 (Oracle) driver.
+
+-  Libraries
+
+   -  Changed $this->cart->insert() in the :doc:`Cart
+      Library <libraries/cart>` to return the Row ID if a single
+      item was inserted successfully.
+   -  Added support to set an optional parameter in your callback rules
+      of validation using the :doc:`Form Validation
+      Library <libraries/form_validation>`.
+   -  Driver children can be located in any package path.
+   -  Added max_filename_increment config setting for Upload library.
+   -  CI_Loader::_ci_autoloader() is now a protected method.
+   -  Added is_unique to the :doc:`Form Validation
+      library <libraries/form_validation>`.
+   -  Modified valid_ip() to use PHP's filter_var() when possible (>= PHP 5.2) in the <a href="libraries/form_validation.html">Form Validation</a> library.
+   -  Added <kbd>$config['use_page_numbers']</kbd> to the <a href="libraries/pagination.html">Pagination library</a>, which enables real page numbers in the URI.
+   -  Added TLS and SSL Encryption for SMTP.
+
+-  Core
+
+   -  Changed private functions in CI_URI to protected so MY_URI can
+      override them.
+   -  Removed CI_CORE boolean constant from CodeIgniter.php (no longer Reactor and Core versions).
+
+Bug fixes for 2.1.0
+-------------------
+
+-  Unlink raised an error if cache file did not exist when you try to delete it.
+-  Fixed #378 Robots identified as regular browsers by the User Agent
+   class.
+-  If a config class was loaded first then a library with the same name
+   is loaded, the config would be ignored.
+-  Fixed a bug (Reactor #19) where 1) the 404_override route was being
+   ignored in some cases, and 2) auto-loaded libraries were not
+   available to the 404_override controller when a controller existed
+   but the requested method did not.
+-  Fixed a bug (Reactor #89) where MySQL export would fail if the table
+   had hyphens or other non alphanumeric/underscore characters.
+-  Fixed a bug (#200) where MySQL queries would be malformed after
+   calling count_all() then db->get()
+-  Fixed bug #105 that stopped query errors from being logged unless database debugging was enabled
+-  Fixed a bug (#181) where a mis-spelling was in the form validation
+   language file.
+-  Fixed a bug (#160) - Removed unneeded array copy in the file cache
+   driver.
+-  Fixed a bug (#150) - field_data() now correctly returns column
+   length.
+-  Fixed a bug (#8) - load_class() now looks for core classes in
+   APPPATH first, allowing them to be replaced.
+-  Fixed a bug (#24) - ODBC database driver called incorrect parent in
+   __construct().
+-  Fixed a bug (#85) - OCI8 (Oracle) database escape_str() function did
+   not escape correct.
+-  Fixed a bug (#344) - Using schema found in <a href="libraries/sessions.html">Saving Session Data to a Database</a>, system would throw error "user_data does not have a default value" when deleting then creating a session.
+-  Fixed a bug (#112) - OCI8 (Oracle) driver didn't pass the configured database character set when connecting.
+-  Fixed a bug (#182) - OCI8 (Oracle) driver used to re-execute the statement whenever num_rows() is called.
+-  Fixed a bug (#82) - WHERE clause field names in the DB <samp>update_string()</samp> method were not escaped, resulting in failed queries in some cases.
+-  Fixed a bug (#89) - Fix a variable type mismatch in DB <samp>display_error()</samp> where an array is expected, but a string could be set instead.
+-  Fixed a bug (#467) - Suppress warnings generated from get_magic_quotes_gpc() (deprecated in PHP 5.4)
+-  Fixed a bug (#484) - First time _csrf_set_hash() is called, hash is never set to the cookie (in Security.php).
+
+Version 2.0.3
+=============
+
+Release Date: August 20, 2011
+
+-  Security
+
+   -  An improvement was made to the MySQL and MySQLi drivers to prevent
+      exposing a potential vector for SQL injection on sites using
+      multi-byte character sets in the database client connection.
+      An incompatibility in PHP versions < 5.2.3 and MySQL < 5.0.7 with
+      *mysql_set_charset()* creates a situation where using multi-byte
+      character sets on these environments may potentially expose a SQL
+      injection attack vector. Latin-1, UTF-8, and other "low ASCII"
+      character sets are unaffected on all environments.
+
+      If you are running or considering running a multi-byte character
+      set for your database connection, please pay close attention to
+      the server environment you are deploying on to ensure you are not
+      vulnerable.
+
+-  General Changes
+
+   -  Fixed a bug where there was a misspelling within a code comment in
+      the index.php file.
+   -  Added Session Class userdata to the output profiler. Additionally,
+      added a show/hide toggle on HTTP Headers, Session Data and Config
+      Variables.
+   -  Removed internal usage of the EXT constant.
+   -  Visual updates to the welcome_message view file and default error
+      templates. Thanks to `danijelb <https://bitbucket.org/danijelb>`_
+      for the pull request.
+   -  Added insert_batch() function to the PostgreSQL database driver.
+      Thanks to epallerols for the patch.
+   -  Added "application/x-csv" to mimes.php.
+   -  Added CSRF protection URI whitelisting.
+   -  Fixed a bug where `Email library <libraries/email>`
+      attachments with a "." in the name would using invalid MIME-types.
+   -  Added support for
+      pem,p10,p12,p7a,p7c,p7m,p7r,p7s,crt,crl,der,kdb,rsa,cer,sst,csr
+      Certs to mimes.php.
+   -  Added support pgp,gpg to mimes.php.
+   -  Added support 3gp, 3g2, mp4, wmv, f4v, vlc Video files to
+      mimes.php.
+   -  Added support m4a, aac, m4u, xspf, au, ac3, flac, ogg Audio files
+      to mimes.php.
+
+-  Helpers
+
+   -  Added an optional third parameter to heading() which allows adding
+      html attributes to the rendered heading tag.
+   -  form_open() now only adds a hidden (Cross-site Reference Forgery)
+      protection field when the form's action is internal and is set to
+      the post method. (Reactor #165)
+   -  Re-worked plural() and singular() functions in the :doc:`Inflector
+      helper <helpers/inflector_helper>` to support considerably
+      more words.
+
+-  Libraries
+
+   -  Altered Session to use a longer match against the user_agent
+      string. See upgrade notes if using database sessions.
+   -  Added $this->db->set_dbprefix() to the :doc:`Database
+      Driver <database/queries>`.
+   -  Changed $this->cart->insert() in the :doc:`Cart
+      Library <libraries/cart>` to return the Row ID if a single
+      item was inserted successfully.
+   -  Added $this->load->get_var() to the :doc:`Loader
+      library <libraries/loader>` to retrieve global vars set with
+      $this->load->view() and $this->load->vars().
+   -  Changed $this->db->having() to insert quotes using escape() rather
+      than escape_str().
+
+Bug fixes for 2.0.3
+-------------------
+
+-  Added ENVIRONMENT to reserved constants. (Reactor #196)
+-  Changed server check to ensure SCRIPT_NAME is defined. (Reactor #57)
+-  Removed APPPATH.'third_party' from the packages autoloader to negate
+   needless file stats if no packages exist or if the developer does not
+   load any other packages by default.
+-  Fixed a bug (Reactor #231) where Sessions Library database table
+   example SQL did not contain an index on last_activity. See :doc:`Upgrade
+   Notes <installation/upgrade_203>`.
+-  Fixed a bug (Reactor #229) where the Sessions Library example SQL in
+   the documentation contained incorrect SQL.
+-  Fixed a bug (Core #340) where when passing in the second parameter to
+   $this->db->select(), column names in subsequent queries would not be
+   properly escaped.
+-  Fixed issue #199 - Attributes passed as string does not include a
+   space between it and the opening tag.
+-  Fixed a bug where the method $this->cart->total_items() from :doc:`Cart
+   Library <libraries/cart>` now returns the sum of the quantity
+   of all items in the cart instead of your total count.
+-  Fixed a bug where not setting 'null' when adding fields in db_forge
+   for mysql and mysqli drivers would default to NULL instead of NOT
+   NULL as the docs suggest.
+-  Fixed a bug where using $this->db->select_max(),
+   $this->db->select_min(), etc could throw notices. Thanks to w43l for
+   the patch.
+-  Replace checks for STDIN with php_sapi_name() == 'cli' which on the
+   whole is more reliable. This should get parameters in crontab
+   working.
+
+Version 2.0.2
+=============
+
+Release Date: April 7, 2011
+Hg Tag: v2.0.2
+
+-  General changes
+
+   -  The :doc:`Security library <./libraries/security>` was moved to
+      the core and is now loaded automatically. Please remove your
+      loading calls.
+   -  The CI_SHA class is now deprecated. All supported versions of PHP
+      provide a sha1() function.
+   -  constants.php will now be loaded from the environment folder if
+      available.
+   -  Added language key error logging
+   -  Made Environment Support optional. Comment out or delete the
+      constant to stop environment checks.
+   -  Added Environment Support for Hooks.
+   -  Added CI\_ Prefix to the :doc:`Cache driver <libraries/caching>`.
+   -  Added :doc:`CLI usage <./general/cli>` documentation.
+
+-  Helpers
+
+   -  Removed the previously deprecated dohash() from the :doc:`Security
+      helper <./helpers/security_helper>`; use do_hash() instead.
+   -  Changed the 'plural' function so that it doesn't ruin the
+      captalization of your string. It also take into consideration
+      acronyms which are all caps.
+
+-  Database
+
+   -  $this->db->count_all_results() will now return an integer
+      instead of a string.
+
+Bug fixes for 2.0.2
+-------------------
+
+-  Fixed a bug (Reactor #145) where the Output Library had
+   parse_exec_vars set to protected.
+-  Fixed a bug (Reactor #80) where is_really_writable would create an
+   empty file when on Windows or with safe_mode enabled.
+-  Fixed various bugs with User Guide.
+-  Added is_cli_request() method to documentation for :doc:`Input
+   class <libraries/input>`.
+-  Added form_validation_lang entries for decimal, less_than and
+   greater_than.
+-  `Fixed issue
+   #153 <https://bitbucket.org/ellislab/codeigniter-reactor/issue/153/escape-str-bug-in-mssql-driver>`_
+   Escape Str Bug in MSSQL driver.
+-  `Fixed issue
+   #172 <https://bitbucket.org/ellislab/codeigniter-reactor/issue/172/bug-in-chrome-and-form_open-in-201>`_
+   Google Chrome 11 posts incorrectly when action is empty.
+
+Version 2.0.1
+=============
+
+Release Date: March 15, 2011
+Hg Tag: v2.0.1
+
+-  General changes
+
+   -  Added $config['cookie_secure'] to the config file to allow
+      requiring a secure (HTTPS) in order to set cookies.
+   -  Added the constant CI_CORE to help differentiate between Core:
+      TRUE and Reactor: FALSE.
+   -  Added an ENVIRONMENT constant in index.php, which affects PHP
+      error reporting settings, and optionally, which configuration
+      files are loaded (see below). Read more on the `Handling
+      Environments <general/environments>` page.
+   -  Added support for
+      :ref:`environment-specific <config-environments>`
+      configuration files.
+
+-  Libraries
+
+   -  Added decimal, less_than and greater_than rules to the `Form
+      validation Class <libraries/form_validation>`.
+   -  :doc:`Input Class <libraries/input>` methods post() and get()
+      will now return a full array if the first argument is not
+      provided.
+   -  Secure cookies can now be made with the set_cookie() helper and
+      :doc:`Input Class <libraries/input>` method.
+   -  Added set_content_type() to :doc:`Output
+      Class <libraries/output>` to set the output Content-Type
+      HTTP header based on a MIME Type or a config/mimes.php array key.
+   -  :doc:`Output Class <libraries/output>` will now support method
+      chaining.
+
+-  Helpers
+
+   -  Changed the logic for form_open() in :doc:`Form
+      helper <helpers/form_helper>`. If no value is passed it will
+      submit to the current URL.
+
+Bug fixes for 2.0.1
+-------------------
+
+-  CLI requests can now be run from any folder, not just when CD'ed next
+   to index.php.
+-  Fixed issue #41: Added audio/mp3 mime type to mp3.
+-  Fixed a bug (Core #329) where the file caching driver referenced the
+   incorrect cache directory.
+-  Fixed a bug (Reactor #69) where the SHA1 library was named
+   incorrectly.
+
+Version 2.0.0
+=============
+
+Release Date: January 28, 2011
+Hg Tag: v2.0.0
+
+-  General changes
+
+   -  PHP 4 support is removed. CodeIgniter now requires PHP 5.1.6.
+   -  Scaffolding, having been deprecated for a number of versions, has
+      been removed.
+   -  Plugins have been removed, in favor of Helpers. The CAPTCHA plugin
+      has been converted to a Helper and
+      :doc:`documented <./helpers/captcha_helper>`. The JavaScript
+      calendar plugin was removed due to the ready availability of great
+      JavaScript calendars, particularly with jQuery.
+   -  Added new special Library type:
+      :doc:`Drivers <./general/drivers>`.
+   -  Added full query-string support. See the config file for details.
+   -  Moved the application folder outside of the system folder.
+   -  Moved system/cache and system/logs directories to the application
+      directory.
+   -  Added routing overrides to the main index.php file, enabling the
+      normal routing to be overridden on a per "index" file basis.
+   -  Added the ability to set config values (or override config values)
+      directly from data set in the main index.php file. This allows a
+      single application to be used with multiple front controllers,
+      each having its own config values.
+   -  Added $config['directory_trigger'] to the config file so that a
+      controller sub-directory can be specified when running _GET
+      strings instead of URI segments.
+   -  Added ability to set "Package" paths - specific paths where the
+      Loader and Config classes should try to look first for a requested
+      file. This allows distribution of sub-applications with their own
+      libraries, models, config files, etc. in a single "package"
+      directory. See the :doc:`Loader class <libraries/loader>`
+      documentation for more details.
+   -  In-development code is now hosted at
+      `BitBucket <http://bitbucket.org/ellislab/codeigniter-reactor/>`_.
+   -  Removed the deprecated Validation Class.
+   -  Added CI\_ Prefix to all core classes.
+   -  Package paths can now be set in application/config/autoload.php.
+   -  `Upload library <libraries/file_uploading>` file_name can
+      now be set without an extension, the extension will be taken from
+      the uploaded file instead of the given name.
+   -  In :doc:`Database Forge <database/forge>` the name can be omitted
+      from $this->dbforge->modify_column()'s 2nd param if you aren't
+      changing the name.
+   -  $config['base_url'] is now empty by default and will guess what
+      it should be.
+   -  Enabled full Command Line Interface compatibility with
+      config['uri_protocol'] = 'CLI';.
+
+-  Libraries
+
+   -  Added a :doc:`Cache driver <libraries/caching>` with APC,
+      memcached, and file-based support.
+   -  Added $prefix, $suffix and $first_url properties to :doc:`Pagination
+      library <./libraries/pagination>`.
+   -  Added the ability to suppress first, previous, next, last, and
+      page links by setting their values to FALSE in the :doc:`Pagination
+      library <./libraries/pagination>`.
+   -  Added :doc:`Security library <./libraries/security>`, which now
+      contains the xss_clean function, filename_security function and
+      other security related functions.
+   -  Added CSRF (Cross-site Reference Forgery) protection to the
+      :doc:`Security library <./libraries/security>`.
+   -  Added $parse_exec_vars property to Output library.
+   -  Added ability to enable / disable individual sections of the
+      :doc:`Profiler <general/profiling>`
+   -  Added a wildcard option $config['allowed_types'] = '\*' to the
+      :doc:`File Uploading Class <./libraries/file_uploading>`.
+   -  Added an 'object' config variable to the XML-RPC Server library so
+      that one can specify the object to look for requested methods,
+      instead of assuming it is in the $CI superobject.
+   -  Added "is_object" into the list of unit tests capable of being
+      run.
+   -  Table library will generate an empty cell with a blank string, or
+      NULL value.
+   -  Added ability to set tag attributes for individual cells in the
+      Table library
+   -  Added a parse_string() method to the :doc:`Parser
+      Class <libraries/parser>`.
+   -  Added HTTP headers and Config information to the
+      :doc:`Profiler <general/profiling>` output.
+   -  Added Chrome and Flock to the list of detectable browsers by
+      browser() in the :doc:`User Agent Class <libraries/user_agent>`.
+   -  The :doc:`Unit Test Class <libraries/unit_testing>` now has an
+      optional "notes" field available to it, and allows for discrete
+      display of test result items using
+      $this->unit->set_test_items().
+   -  Added a $xss_clean class variable to the XMLRPC library, enabling
+      control over the use of the Security library's xss_clean()
+      method.
+   -  Added a download() method to the :doc:`FTP
+      library <libraries/ftp>`
+   -  Changed do_xss_clean() to return FALSE if the uploaded file
+      fails XSS checks.
+   -  Added stripslashes() and trim()ing of double quotes from $_FILES
+      type value to standardize input in Upload library.
+   -  Added a second parameter (boolean) to
+      $this->zip->read_dir('/path/to/directory', FALSE) to remove the
+      preceding trail of empty folders when creating a Zip archive. This
+      example would contain a zip with "directory" and all of its
+      contents.
+   -  Added ability in the Image Library to handle PNG transparency for
+      resize operations when using the GD lib.
+   -  Modified the Session class to prevent use if no encryption key is
+      set in the config file.
+   -  Added a new config item to the Session class
+      sess_expire_on_close to allow sessions to auto-expire when the
+      browser window is closed.
+   -  Improved performance of the Encryption library on servers where
+      Mcrypt is available.
+   -  Changed the default encryption mode in the Encryption library to
+      CBC.
+   -  Added an encode_from_legacy() method to provide a way to
+      transition encrypted data from CodeIgniter 1.x to CodeIgniter 2.x.
+      Please see the :doc:`upgrade
+      instructions <./installation/upgrade_200>` for details.
+   -  Altered Form_Validation library to allow for method chaining on
+      set_rules(), set_message() and set_error_delimiters()
+      functions.
+   -  Altered Email Library to allow for method chaining.
+   -  Added request_headers(), get_request_header() and
+      is_ajax_request() to the input class.
+   -  Altered :doc:`User agent library <libraries/user_agent>` so that
+      is_browser(), is_mobile() and is_robot() can optionally check
+      for a specific browser or mobile device.
+   -  Altered :doc:`Input library <libraries/input>` so that post() and
+      get() will return all POST and GET items (respectively) if there
+      are no parameters passed in.
+
+-  Database
+
+   -  :doc:`database configuration <./database/configuration>`.
+   -  Added autoinit value to :doc:`database
+      configuration <./database/configuration>`.
+   -  Added stricton value to :doc:`database
+      configuration <./database/configuration>`.
+   -  Added database_exists() to the :doc:`Database Utilities
+      Class <database/utilities>`.
+   -  Semantic change to db->version() function to allow a list of
+      exceptions for databases with functions to return version string
+      instead of specially formed SQL queries. Currently this list only
+      includes Oracle and SQLite.
+   -  Fixed a bug where driver specific table identifier protection
+      could lead to malformed queries in the field_data() functions.
+   -  Fixed a bug where an undefined class variable was referenced in
+      database drivers.
+   -  Modified the database errors to show the filename and line number
+      of the problematic query.
+   -  Removed the following deprecated functions: orwhere, orlike,
+      groupby, orhaving, orderby, getwhere.
+   -  Removed deprecated _drop_database() and _create_database()
+      functions from the db utility drivers.
+   -  Improved dbforge create_table() function for the Postgres driver.
+
+-  Helpers
+
+   -  Added convert_accented_characters() function to :doc:`text
+      helper <./helpers/text_helper>`.
+   -  Added accept-charset to the list of inserted attributes of
+      form_open() in the :doc:`Form Helper <helpers/form_helper>`.
+   -  Deprecated the dohash() function in favour of do_hash() for
+      naming consistency.
+   -  Non-backwards compatible change made to get_dir_file_info() in
+      the :doc:`File Helper <helpers/file_helper>`. No longer recurses
+      by default so as to encourage responsible use (this function can
+      cause server performance issues when used without caution).
+   -  Modified the second parameter of directory_map() in the
+      :doc:`Directory Helper <helpers/directory_helper>` to accept an
+      integer to specify recursion depth.
+   -  Modified delete_files() in the :doc:`File
+      Helper <helpers/file_helper>` to return FALSE on failure.
+   -  Added an optional second parameter to byte_format() in the
+      :doc:`Number Helper <helpers/number_helper>` to allow for decimal
+      precision.
+   -  Added alpha, and sha1 string types to random_string() in the
+      :doc:`String Helper <helpers/string_helper>`.
+   -  Modified prep_url() so as to not prepend http:// if the supplied
+      string already has a scheme.
+   -  Modified get_file_info in the file helper, changing filectime()
+      to filemtime() for dates.
+   -  Modified smiley_js() to add optional third parameter to return
+      only the javascript with no script tags.
+   -  The img() function of the :doc:`HTML
+      helper <./helpers/html_helper>` will now generate an empty
+      string as an alt attribute if one is not provided.
+   -  If CSRF is enabled in the application config file, form_open()
+      will automatically insert it as a hidden field.
+   -  Added sanitize_filename() into the :doc:`Security
+      helper <./helpers/security_helper>`.
+   -  Added ellipsize() to the :doc:`Text
+      Helper <./helpers/text_helper>`
+   -  Added elements() to the :doc:`Array
+      Helper <./helpers/array_helper>`
+
+-  Other Changes
+
+   -  Added an optional second parameter to show_404() to disable
+      logging.
+   -  Updated loader to automatically apply the sub-class prefix as an
+      option when loading classes. Class names can be prefixed with the
+      standard "CI\_" or the same prefix as the subclass prefix, or no
+      prefix at all.
+   -  Increased randomness with is_really_writable() to avoid file
+      collisions when hundreds or thousands of requests occur at once.
+   -  Switched some DIR_WRITE_MODE constant uses to FILE_WRITE_MODE
+      where files and not directories are being operated on.
+   -  get_mime_by_extension() is now case insensitive.
+   -  Added "default" to the list :doc:`Reserved
+      Names <general/reserved_names>`.
+   -  Added 'application/x-msdownload' for .exe files and
+      ''application/x-gzip-compressed' for .tgz files to
+      config/mimes.php.
+   -  Updated the output library to no longer compress output or send
+      content-length headers if the server runs with
+      zlib.output_compression enabled.
+   -  Eliminated a call to is_really_writable() on each request unless
+      it is really needed (Output caching)
+   -  Documented append_output() in the :doc:`Output
+      Class <libraries/output>`.
+   -  Documented a second argument in the decode() function for the
+      :doc:`Encryption Class <libraries/encryption>`.
+   -  Documented db->close().
+   -  Updated the router to support a default route with any number of
+      segments.
+   -  Moved _remove_invisible_characters() function from the
+      :doc:`Security Library <libraries/security>` to :doc:`common
+      functions. <general/common_functions>`
+   -  Added audio/mpeg3 as a valid mime type for MP3.
+
+Bug fixes for 2.0.0
+-------------------
+
+-  Fixed a bug where you could not change the User-Agent when sending
+   email.
+-  Fixed a bug where the Output class would send incorrect cached output
+   for controllers implementing their own _output() method.
+-  Fixed a bug where a failed query would not have a saved query
+   execution time causing errors in the Profiler
+-  Fixed a bug that was writing log entries when multiple identical
+   helpers and plugins were loaded.
+-  Fixed assorted user guide typos or examples (#10693, #8951, #7825,
+   #8660, #7883, #6771, #10656).
+-  Fixed a language key in the profiler: "profiler_no_memory_usage"
+   to "profiler_no_memory".
+-  Fixed an error in the Zip library that didn't allow downloading on
+   PHP 4 servers.
+-  Fixed a bug in the Form Validation library where fields passed as
+   rule parameters were not being translated (#9132)
+-  Modified inflector helper to properly pluralize words that end in
+   'ch' or 'sh'
+-  Fixed a bug in xss_clean() that was not allowing hyphens in query
+   strings of submitted URLs.
+-  Fixed bugs in get_dir_file_info() and get_file_info() in the
+   File Helper with recursion, and file paths on Windows.
+-  Fixed a bug where Active Record override parameter would not let you
+   disable Active Record if it was enabled in your database config file.
+-  Fixed a bug in reduce_double_slashes() in the String Helper to
+   properly remove duplicate leading slashes (#7585)
+-  Fixed a bug in values_parsing() of the XML-RPC library which
+   prevented NULL variables typed as 'string' from being handled
+   properly.
+-  Fixed a bug were form_open_multipart() didn't accept string
+   attribute arguments (#10930).
+-  Fixed a bug (#10470) where get_mime_by_extension() was case
+   sensitive.
+-  Fixed a bug where some error messages for the SQLite and Oracle
+   drivers would not display.
+-  Fixed a bug where files created with the Zip Library would result in
+   file creation dates of 1980.
+-  Fixed a bug in the Session library that would result in PHP error
+   when attempting to store values with objects.
+-  Fixed a bug where extending the Controller class would result in a
+   fatal PHP error.
+-  Fixed a PHP Strict Standards Error in the index.php file.
+-  Fixed a bug where getimagesize() was being needlessly checked on
+   non-image files in is_allowed_type().
+-  Fixed a bug in the Encryption library where an empty key was not
+   triggering an error.
+-  Fixed a bug in the Email library where CC and BCC recipients were not
+   reset when using the clear() method (#109).
+-  Fixed a bug in the URL Helper where prep_url() could cause a PHP
+   error on PHP versions < 5.1.2.
+-  Added a log message in core/output if the cache directory config
+   value was not found.
+-  Fixed a bug where multiple libraries could not be loaded by passing
+   an array to load->library()
+-  Fixed a bug in the html helper where too much white space was
+   rendered between the src and alt tags in the img() function.
+-  Fixed a bug in the profilers _compile_queries() function.
+-  Fixed a bug in the date helper where the DATE_ISO8601 variable was
+   returning an incorrectly formatted date string.
+
+Version 1.7.2
+=============
+
+Release Date: September 11, 2009
+Hg Tag: v1.7.2
+
+-  Libraries
+
+   -  Added a new :doc:`Cart Class <libraries/cart>`.
+   -  Added the ability to pass $config['file_name'] for the :doc:`File
+      Uploading Class <libraries/file_uploading>` and rename the
+      uploaded file.
+   -  Changed order of listed user-agents so Safari would more
+      accurately report itself. (#6844)
+
+-  Database
+
+   -  Switched from using gettype() in escape() to is\_* methods, since
+      future PHP versions might change its output.
+   -  Updated all database drivers to handle arrays in escape_str()
+   -  Added escape_like_str() method for escaping strings to be used
+      in LIKE conditions
+   -  Updated Active Record to utilize the new LIKE escaping mechanism.
+   -  Added reconnect() method to DB drivers to try to keep alive /
+      reestablish a connection after a long idle.
+   -  Modified MSSQL driver to use mssql_get_last_message() for error
+      messages.
+
+-  Helpers
+
+   -  Added form_multiselect() to the :doc:`Form
+      helper <helpers/form_helper>`.
+   -  Modified form_hidden() in the :doc:`Form
+      helper <helpers/form_helper>` to accept multi-dimensional
+      arrays.
+   -  Modified form_prep() in the :doc:`Form
+      helper <helpers/form_helper>` to keep track of prepped
+      fields to avoid multiple prep/mutation from subsequent calls which
+      can occur when using Form Validation and form helper functions to
+      output form fields.
+   -  Modified directory_map() in the :doc:`Directory
+      helper <helpers/directory_helper>` to allow the inclusion of
+      hidden files, and to return FALSE on failure to read directory.
+   -  Modified the :doc:`Smiley helper <helpers/smiley_helper>` to work
+      with multiple fields and insert the smiley at the last known
+      cursor position.
+
+-  General
+
+   -  Compatible with PHP 5.3.0
+   -  Modified :doc:`show_error() <general/errors>` to allow sending
+      of HTTP server response codes.
+   -  Modified :doc:`show_404() <general/errors>` to send 404 status
+      code, removing non-CGI compatible header() statement from
+      error_404.php template.
+   -  Added set_status_header() to the :doc:`Common
+      functions <general/common_functions>` to allow use when the
+      Output class is unavailable.
+   -  Added is_php() to :doc:`Common
+      functions <general/common_functions>` to facilitate PHP
+      version comparisons.
+   -  Added 2 CodeIgniter "cheatsheets" (thanks to DesignFellow.com for
+      this contribution).
+
+Bug fixes for 1.7.2
+-------------------
+
+-  Fixed assorted user guide typos or examples (#6743, #7214, #7516,
+   #7287, #7852, #8224, #8324, #8349).
+-  Fixed a bug in the Form Validation library where multiple callbacks
+   weren't working (#6110)
+-  doctype helper default value was missing a "1".
+-  Fixed a bug in the language class when outputting an error for an
+   unfound file.
+-  Fixed a bug in the Calendar library where the shortname was output
+   for "May".
+-  Fixed a bug with ORIG_PATH_INFO that was allowing URIs of just a
+   slash through.
+-  Fixed a fatal error in the Oracle and ODBC drivers (#6752)
+-  Fixed a bug where xml_from_result() was checking for a nonexistent
+   method.
+-  Fixed a bug where Database Forge's add_column and modify_column
+   were not looping through when sent multiple fields.
+-  Fixed a bug where the File Helper was using '/' instead of the
+   DIRECTORY_SEPARATOR constant.
+-  Fixed a bug to prevent PHP errors when attempting to use sendmail on
+   servers that have manually disabled the PHP popen() function.
+-  Fixed a bug that would cause PHP errors in XML-RPC data if the PHP
+   data type did not match the specified XML-RPC type.
+-  Fixed a bug in the XML-RPC class with parsing dateTime.iso8601 data
+   types.
+-  Fixed a case sensitive string replacement in xss_clean()
+-  Fixed a bug in form_textarea() where form data was not prepped
+   correctly.
+-  Fixed a bug in form_prep() causing it to not preserve entities in
+   the user's original input when called back into a form element
+-  Fixed a bug in _protect_identifiers() where the swap prefix
+   ($swap_pre) was not being observed.
+-  Fixed a bug where the 400 status header sent with the 'disallowed URI
+   characters' was not compatible with CGI environments.
+-  Fixed a bug in the typography class where heading tags could have
+   paragraph tags inserted when using auto_typography().
+
+Version 1.7.1
+=============
+
+Release Date: February 10, 2009
+Hg Tag: 1.7.1
+
+-  Libraries
+
+   -  Fixed an arbitrary script execution security flaw (#6068) in the
+      Form Validation library (thanks to hkk)
+   -  Changed default current page indicator in the Pagination library
+      to use <strong> instead of <b>
+   -  A "HTTP/1.1 400 Bad Request" header is now sent when disallowed
+      characters are encountered.
+   -  Added <big>, <small>, <q>, and <tt> to the Typography parser's
+      inline elements.
+   -  Added more accurate error reporting for the Email library when
+      using sendmail.
+   -  Removed a strict type check from the rotate() function of the
+      :doc:`Image Manipulation Class <libraries/image_lib>`.
+   -  Added enhanced error checking in file saving in the Image library
+      when using the GD lib.
+   -  Added an additional newline between multipart email headers and
+      the MIME message text for better compatibility with a variety of
+      MUAs.
+   -  Made modest improvements to efficiency and accuracy of
+      explode_name() in the Image lib.
+
+-  Database
+
+   -  Added where_in to the list of expected arguments received by
+      delete().
+
+-  Helpers
+
+   -  Added the ability to have optgroups in form_dropdown() within the
+      :doc:`form helper <helpers/form_helper>`.
+   -  Added a doctype() function to the :doc:`HTML
+      helper <helpers/html_helper>`.
+   -  Added ability to force lowercase for url_title() in the :doc:`URL
+      helper <helpers/url_helper>`.
+   -  Changed the default "type" of form_button() to "button" from
+      "submit" in the :doc:`form helper <helpers/form_helper>`.
+   -  Changed redirect() in the URL helper to allow redirections to URLs
+      outside of the CI site.
+   -  Updated get_cookie() to try to fetch the cookie using the global
+      cookie prefix if the requested cookie name doesn't exist.
+
+-  Other Changes
+
+   -  Improved security in xss_clean() to help prevent attacks
+      targeting Internet Explorer.
+   -  Added 'application/msexcel' to config/mimes.php for .xls files.
+   -  Added 'proxy_ips' config item to whitelist reverse proxy servers
+      from which to trust the HTTP_X_FORWARDED_FOR header to to
+      determine the visitor's IP address.
+   -  Improved accuracy of Upload::is_allowed_filetype() for images
+      (#6715)
+
+Bug fixes for 1.7.1
+-------------------
+
+-  Database
+
+   -  Fixed a bug when doing 'random' on order_by() (#5706).
+   -  Fixed a bug where adding a primary key through Forge could fail
+      (#5731).
+   -  Fixed a bug when using DB cache on multiple databases (#5737).
+   -  Fixed a bug where TRUNCATE was not considered a "write" query
+      (#6619).
+   -  Fixed a bug where csv_from_result() was checking for a
+      nonexistent method.
+   -  Fixed a bug _protect_identifiers() where it was improperly
+      removing all pipe symbols from items
+
+-  Fixed assorted user guide typos or examples (#5998, #6093, #6259,
+   #6339, #6432, #6521).
+-  Fixed a bug in the MySQLi driver when no port is specified
+-  Fixed a bug (#5702), in which the field label was not being fetched
+   properly, when "matching" one field to another.
+-  Fixed a bug in which identifers were not being escaped properly when
+   reserved characters were used.
+-  Fixed a bug with the regular expression used to protect submitted
+   paragraph tags in auto typography.
+-  Fixed a bug where double dashes within tag attributes were being
+   converted to em dash entities.
+-  Fixed a bug where double spaces within tag attributes were being
+   converted to non-breaking space entities.
+-  Fixed some accuracy issues with curly quotes in
+   Typography::format_characters()
+-  Changed a few docblock comments to reflect actual return values.
+-  Fixed a bug with high ascii characters in subject and from email
+   headers.
+-  Fixed a bug in xss_clean() where whitespace following a validated
+   character entity would not be preserved.
+-  Fixed a bug where HTML comments and <pre> tags were being parsed in
+   Typography::auto_typography().
+-  Fixed a bug with non-breaking space cleanup in
+   Typography::auto_typography().
+-  Fixed a bug in database escaping where a compound statement (ie:
+   SUM()) wasn't handled correctly with database prefixes.
+-  Fixed a bug when an opening quote is preceded by a paragraph tag and
+   immediately followed by another tag.
+-  Fixed a bug in the Text Helper affecting some locales where
+   word_censor() would not work on words beginning or ending with an
+   accented character.
+-  Fixed a bug in the Text Helper character limiter where the provided
+   limit intersects the last word of the string.
+-  Fixed a bug (#6342) with plural() in the Inflection helper with words
+   ending in "y".
+-  Fixed bug (#6517) where Routed URI segments returned by
+   URI::rsegment() method were incorrect for the default controller.
+-  Fixed a bug (#6706) in the Security Helper where xss_clean() was
+   using a deprecated second argument.
+-  Fixed a bug in the URL helper url_title() function where trailing
+   periods were allowed at the end of a URL.
+-  Fixed a bug (#6669) in the Email class when CRLF's are used for the
+   newline character with headers when used with the "mail" protocol.
+-  Fixed a bug (#6500) where URI::A_filter_uri() was exit()ing an
+   error instead of using show_error().
+-  Fixed a bug (#6592) in the File Helper where get_dir_file_info()
+   where recursion was not occurring properly.
+-  Tweaked Typography::auto_typography() for some edge-cases.
+
+Version 1.7
+===========
+
+Release Date: October 23, 2008
+Hg Tag: 1.7.0
+
+-  Libraries
+
+   -  Added a new :doc:`Form Validation
+      Class <libraries/form_validation>`. It simplifies setting
+      rules and field names, supports arrays as field names, allows
+      groups of validation rules to be saved in a config file, and adds
+      some helper functions for use in view files. **Please note that
+      the old Validation class is now deprecated**. We will leave it in
+      the library folder for some time so that existing applications
+      that use it will not break, but you are encouraged to migrate to
+      the new version.
+   -  Updated the :doc:`Sessions class <libraries/sessions>` so that
+      any custom data being saved gets stored to a database rather than
+      the session cookie (assuming you are using a database to store
+      session data), permitting much more data to be saved.
+   -  Added the ability to store libraries in subdirectories within
+      either the main "libraries" or the local application "libraries"
+      folder. Please see the :doc:`Loader class <libraries/loader>` for
+      more info.
+   -  Added the ability to assign library objects to your own variable
+      names when you use $this->load->library(). Please see the :doc:`Loader
+      class <libraries/loader>` for more info.
+   -  Added controller class/method info to :doc:`Profiler
+      class <general/profiling>` and support for multiple database
+      connections.
+   -  Improved the "auto typography" feature and moved it out of the
+      helper into its own :doc:`Typography
+      Class <libraries/typography>`.
+   -  Improved performance and accuracy of xss_clean(), including
+      reduction of false positives on image/file tests.
+   -  Improved :doc:`Parser class <./libraries/parser>` to allow
+      multiple calls to the parse() function. The output of each is
+      appended in the output.
+   -  Added max_filename option to set a file name length limit in the
+      :doc:`File Upload Class <libraries/file_uploading>`.
+   -  Added set_status_header() function to :doc:`Output
+      class <libraries/output>`.
+   -  Modified :doc:`Pagination <libraries/pagination>` class to only
+      output the "First" link when the link for page one would not be
+      shown.
+   -  Added support for mb_strlen in the :doc:`Form
+      Validation <libraries/form_validation>` class so that
+      multi-byte languages will calculate string lengths properly.
+
+-  Database
+
+   -  Improved Active Record class to allow full path column and table
+      names: hostname.database.table.column. Also improved the alias
+      handling.
+   -  Improved how table and column names are escaped and prefixed. It
+      now honors full path names when adding prefixes and escaping.
+   -  Added Active Record caching feature to "update" and "delete"
+      functions.
+   -  Added removal of non-printing control characters in escape_str()
+      of DB drivers that do not have native PHP escaping mechanisms
+      (mssql, oci8, odbc), to avoid potential SQL errors, and possible
+      sources of SQL injection.
+   -  Added port support to MySQL, MySQLi, and MS SQL database drivers.
+   -  Added driver name variable in each DB driver, based on bug report
+      #4436.
+
+-  Helpers
+
+   -  Added several new "setting" functions to the :doc:`Form
+      helper <helpers/form_helper>` that allow POST data to be
+      retrieved and set into forms. These are intended to be used on
+      their own, or with the new :doc:`Form Validation
+      Class <libraries/form_validation>`.
+   -  Added current_url() and uri_segments() to :doc:`URL
+      helper <helpers/url_helper>`.
+   -  Altered auto_link() in the :doc:`URL
+      helper <helpers/url_helper>` so that email addresses with
+      "+" included will be linked.
+   -  Added meta() function to :doc:`HTML
+      helper <helpers/html_helper>`.
+   -  Improved accuracy of calculations in :doc:`Number
+      helper <helpers/number_helper>`.
+   -  Removed added newlines ("\\n") from most form and html helper
+      functions.
+   -  Tightened up validation in the :doc:`Date
+      helper <helpers/date_helper>` function human_to_unix(),
+      and eliminated the POSIX regex.
+   -  Updated :doc:`Date helper <helpers/date_helper>` to match the
+      world's current time zones and offsets.
+   -  Modified url_title() in the :doc:`URL
+      helper <helpers/url_helper>` to remove characters and digits
+      that are part of character entities, to allow dashes, underscores,
+      and periods regardless of the $separator, and to allow uppercase
+      characters.
+   -  Added support for arbitrary attributes in anchor_popup() of the
+      :doc:`URL helper <helpers/url_helper>`.
+
+-  Other Changes
+
+   -  Added :doc:`PHP Style Guide <./general/styleguide>` to docs.
+   -  Added sanitization in xss_clean() for a deprecated HTML tag that
+      could be abused in user input in Internet Explorer.
+   -  Added a few openxml document mime types, and an additional mobile
+      agent to mimes.php and user_agents.php respectively.
+   -  Added a file lock check during caching, before trying to write to
+      the file.
+   -  Modified Cookie key cleaning to unset a few troublesome key names
+      that can be present in certain environments, preventing CI from
+      halting execution.
+   -  Changed the output of the profiler to use style attribute rather
+      than clear, and added the id "codeigniter_profiler" to the
+      container div.
+
+Bug fixes for 1.7.0
+-------------------
+
+-  Fixed bug in xss_clean() that could remove some desirable tag
+   attributes.
+-  Fixed assorted user guide typos or examples (#4807, #4812, #4840,
+   #4862, #4864, #4899, #4930, #5006, #5071, #5158, #5229, #5254,
+   #5351).
+-  Fixed an edit from 1.6.3 that made the $robots array in
+   user_agents.php go poof.
+-  Fixed a bug in the :doc:`Email library <libraries/email>` with
+   quoted-printable encoding improperly encoding space and tab
+   characters.
+-  Modified XSS sanitization to no longer add semicolons after &[single
+   letter], such as in M&M's, B&B, etc.
+-  Modified XSS sanitization to no longer strip XHTML image tags of
+   closing slashes.
+-  Fixed a bug in the Session class when database sessions are used
+   where upon session update all userdata would be errantly written to
+   the session cookie.
+-  Fixed a bug (#4536) in backups with the MySQL driver where some
+   legacy code was causing certain characters to be double escaped.
+-  Fixed a routing bug (#4661) that occurred when the default route
+   pointed to a subfolder.
+-  Fixed the spelling of "Dhaka" in the timezone_menu() function of the
+   :doc:`Date helper. <helpers/date_helper>`
+-  Fixed the spelling of "raspberry" in config/smileys.php.
+-  Fixed incorrect parenthesis in form_open() function (#5135).
+-  Fixed a bug that was ignoring case when comparing controller methods
+   (#4560).
+-  Fixed a bug (#4615) that was not setting SMTP authorization settings
+   when using the initialize function.
+-  Fixed a bug in highlight_code() in the :doc:`Text
+   helper <helpers/text_helper>` that would leave a stray </span>
+   in certain cases.
+-  Fixed Oracle bug (#3306) that was preventing multiple queries in one
+   action.
+-  Fixed ODBC bug that was ignoring connection params due to its use of
+   a constructor.
+-  Fixed a DB driver bug with num_rows() that would cause an error with
+   the Oracle driver.
+-  Fixed MS SQL bug (#4915). Added brackets around database name in MS
+   SQL driver when selecting the database, in the event that reserved
+   characters are used in the name.
+-  Fixed a DB caching bug (4718) in which the path was incorrect when no
+   URI segments were present.
+-  Fixed Image_lib class bug #4562. A path was not defined for NetPBM.
+-  Fixed Image_lib class bug #4532. When cropping an image with
+   identical height/width settings on output, a copy is made.
+-  Fixed DB_driver bug (4900), in which a database error was not being
+   logged correctly.
+-  Fixed DB backup bug in which field names were not being escaped.
+-  Fixed a DB Active Record caching bug in which multiple calls to
+   cached data were not being honored.
+-  Fixed a bug in the Session class that was disallowing slashes in the
+   serialized array.
+-  Fixed a Form Validation bug in which the "isset" error message was
+   being trigged by the "required" rule.
+-  Fixed a spelling error in a Loader error message.
+-  Fixed a bug (5050) with IP validation with empty segments.
+-  Fixed a bug in which the parser was being greedy if multiple
+   identical sets of tags were encountered.
+
+Version 1.6.3
+=============
+
+Release Date: June 26, 2008
+Hg Tag: v1.6.3
+
+Version 1.6.3 is a security and maintenance release and is recommended
+for all users.
+
+-  Database
+
+   -  Modified MySQL/MySQLi Forge class to give explicit names to keys
+   -  Added ability to set multiple column non-primary keys to the
+      :doc:`Forge class <database/forge>`
+   -  Added ability to set additional database config values in :doc:`DSN
+      connections <database/connecting>` via the query string.
+
+-  Libraries
+
+   -  Set the mime type check in the :doc:`Upload
+      class <libraries/file_uploading>` to reference the global
+      mimes variable.
+   -  Added support for query strings to the :doc:`Pagination
+      class <libraries/pagination>`, automatically detected or
+      explicitly declared.
+   -  Added get_post() to the :doc:`Input class <libraries/input>`.
+   -  Documented get() in the :doc:`Input class <libraries/input>`.
+   -  Added the ability to automatically output language items as form
+      labels in the :doc:`Language class <libraries/language>`.
+
+-  Helpers
+
+   -  Added a :doc:`Language helper <helpers/language_helper>`.
+   -  Added a :doc:`Number helper <helpers/number_helper>`.
+   -  :doc:`Form helper <helpers/form_helper>` refactored to allow
+      form_open() and form_fieldset() to accept arrays or strings as
+      arguments.
+
+-  Other changes
+
+   -  Improved security in xss_clean().
+   -  Removed an unused Router reference in _display_cache().
+   -  Added ability to :doc:`use xss_clean() to test
+      images <libraries/input>` for XSS, useful for upload
+      security.
+   -  Considerably expanded list of mobile user-agents in
+      config/user_agents.php.
+   -  Charset information in the userguide has been moved above title
+      for internationalization purposes (#4614).
+   -  Added "Using Associative Arrays In a Request Parameter" example to
+      the :doc:`XMLRPC userguide page <libraries/xmlrpc>`.
+   -  Removed maxlength and size as automatically added attributes of
+      form_input() in the :doc:`form helper <helpers/form_helper>`.
+   -  Documented the language file use of byte_format() in the :doc:`number
+      helper <helpers/number_helper>`.
+
+Bug fixes for 1.6.3
+-------------------
+
+-  Added a language key for valid_emails in validation_lang.php.
+-  Amended fixes for bug (#3419) with parsing DSN database connections.
+-  Moved the _has_operators() function (#4535) into DB_driver from
+   DB_active_rec.
+-  Fixed a syntax error in upload_lang.php.
+-  Fixed a bug (#4542) with a regular expression in the Image library.
+-  Fixed a bug (#4561) where orhaving() wasn't properly passing values.
+-  Removed some unused variables from the code (#4563).
+-  Fixed a bug where having() was not adding an = into the statement
+   (#4568).
+-  Fixed assorted user guide typos or examples (#4574, #4706).
+-  Added quoted-printable headers to Email class when the multi-part
+   override is used.
+-  Fixed a double opening <p> tag in the index pages of each system
+   directory.
+
+Version 1.6.2
+=============
+
+Release Date: May 13, 2008
+Hg Tag: 1.6.2
+
+-  Active Record
+
+   -  Added the ability to prevent escaping in having() clauses.
+   -  Added rename_table() into :doc:`DBForge <./database/forge>`.
+   -  Fixed a bug that wasn't allowing escaping to be turned off if the
+      value of a query was NULL.
+   -  DB Forge is now assigned to any models that exist after loading
+      (#3457).
+
+-  Database
+
+   -  Added :doc:`Strict Mode <./database/transactions>` to database
+      transactions.
+   -  Escape behaviour in where() clauses has changed; values in those
+      with the "FALSE" argument are no longer escaped (ie: quoted).
+
+-  Config
+
+   -  Added 'application/vnd.ms-powerpoint' to list of mime types.
+   -  Added 'audio/mpg' to list of mime types.
+   -  Added new user-modifiable file constants.php containing file mode
+      and fopen constants.
+   -  Added the ability to set CRLF settings via config in the
+      :doc:`Email <libraries/email>` class.
+
+-  Libraries
+
+   -  Added increased security for filename handling in the Upload
+      library.
+   -  Added increased security for sessions for client-side data
+      tampering.
+   -  The MySQLi forge class is now in sync with MySQL forge.
+   -  Added the ability to set CRLF settings via config in the
+      :doc:`Email <libraries/email>` class.
+   -  :doc:`Unit Testing <libraries/unit_testing>` results are now
+      colour coded, and a change was made to the default template of
+      results.
+   -  Added a valid_emails rule to the Validation class.
+   -  The :doc:`Zip class <libraries/zip>` now exits within download().
+   -  The :doc:`Zip class <libraries/zip>` has undergone a substantial
+      re-write for speed and clarity (thanks stanleyxu for the hard work
+      and code contribution in bug report #3425!)
+
+-  Helpers
+
+   -  Added a Compatibility
+      Helper for using some common
+      PHP 5 functions safely in applications that might run on PHP 4
+      servers (thanks Seppo for the hard work and code contribution!)
+   -  Added form_button() in the :doc:`Form
+      helper <helpers/form_helper>`.
+   -  Changed the radio() and checkbox() functions to default to not
+      checked by default.
+   -  Added the ability to include an optional HTTP Response Code in the
+      redirect() function of the :doc:`URL
+      Helper <helpers/url_helper>`.
+   -  Modified img() in the :doc:`HTML Helper <helpers/html_helper>` to
+      remove an unneeded space (#4208).
+   -  Modified anchor() in the :doc:`URL helper <helpers/url_helper>`
+      to no longer add a default title= attribute (#4209).
+   -  The :doc:`Download helper <helpers/download_helper>` now exits
+      within force_download().
+   -  Added get_dir_file_info(), get_file_info(), and
+      get_mime_by_extension() to the :doc:`File
+      Helper <helpers/file_helper>`.
+   -  Added symbolic_permissions() and octal_permissions() to the
+      :doc:`File helper <helpers/file_helper>`.
+
+-  Plugins
+
+   -  Modified captcha generation to first look for the function
+      imagecreatetruecolor, and fallback to imagecreate if it isn't
+      available (#4226).
+
+-  Other Changes
+
+   -  Added ability for :doc:`xss_clean() <libraries/input>` to accept
+      arrays.
+   -  Removed closing PHP tags from all PHP files to avoid accidental
+      output and potential 'cannot modify headers' errors.
+   -  Removed "scripts" from the auto-load search path. Scripts were
+      deprecated in Version 1.4.1 (September 21, 2006). If you still
+      need to use them for legacy reasons, they must now be manually
+      loaded in each Controller.
+   -  Added a :doc:`Reserved Names <general/reserved_names>` page to
+      the userguide, and migrated reserved controller names into it.
+   -  Added a :doc:`Common Functions <general/common_functions>` page
+      to the userguide for globally available functions.
+   -  Improved security and performance of xss_clean().
+
+Bugfixes for 1.6.2
+------------------
+
+-  Fixed a bug where SET queries were not being handled as "write"
+   queries.
+-  Fixed a bug (#3191) with ORIG_PATH_INFO URI parsing.
+-  Fixed a bug in DB Forge, when inserting an id field (#3456).
+-  Fixed a bug in the table library that could cause identically
+   constructed rows to be dropped (#3459).
+-  Fixed DB Driver and MySQLi result driver checking for resources
+   instead of objects (#3461).
+-  Fixed an AR_caching error where it wasn't tracking table aliases
+   (#3463).
+-  Fixed a bug in AR compiling, where select statements with arguments
+   got incorrectly escaped (#3478).
+-  Fixed an incorrect documentation of $this->load->language (#3520).
+-  Fixed bugs (#3523, #4350) in get_filenames() with recursion and
+   problems with Windows when $include_path is used.
+-  Fixed a bug (#4153) in the XML-RPC class preventing dateTime.iso8601
+   from being used.
+-  Fixed an AR bug with or_where_not_in() (#4171).
+-  Fixed a bug with :doc:`xss_clean() <libraries/input>` that would
+   add semicolons to GET URI variable strings.
+-  Fixed a bug (#4206) in the Directory Helper where the directory
+   resource was not being closed, and minor improvements.
+-  Fixed a bug in the FTP library where delete_dir() was not working
+   recursively (#4215).
+-  Fixed a Validation bug when set_rules() is used with a non-array
+   field name and rule (#4220).
+-  Fixed a bug (#4223) where DB caching would not work for returned DB
+   objects or multiple DB connections.
+-  Fixed a bug in the Upload library that might output the same error
+   twice (#4390).
+-  Fixed an AR bug when joining with a table alias and table prefix
+   (#4400).
+-  Fixed a bug in the DB class testing the $params argument.
+-  Fixed a bug in the Table library where the integer 0 in cell data
+   would be displayed as a blank cell.
+-  Fixed a bug in link_tag() of the :doc:`URL
+   helper <helpers/url_helper>` where a key was passed instead of
+   a value.
+-  Fixed a bug in DB_result::row() that prevented it from returning
+   individual fields with MySQL NULL values.
+-  Fixed a bug where SMTP emails were not having dot transformation
+   performed on lines that begin with a dot.
+-  Fixed a bug in display_error() in the DB driver that was
+   instantiating new Language and Exception objects, and not using the
+   error heading.
+-  Fixed a bug (#4413) where a URI containing slashes only e.g.
+   'http://example.com/index.php?//' would result in PHP errors
+-  Fixed an array to string conversion error in the Validation library
+   (#4425)
+-  Fixed bug (#4451, #4299, #4339) where failed transactions will not
+   rollback when debug mode is enabled.
+-  Fixed a bug (#4506) with overlay_watermark() in the Image library
+   preventing support for PNG-24s with alpha transparency
+-  Fixed assorted user guide typos (#3453, #4364, #4379, #4399, #4408,
+   #4412, #4448, #4488).
+
+Version 1.6.1
+=============
+
+Release Date: February 12, 2008
+Hg Tag: 1.6.1
+
+-  Active Record
+
+   -  Added :ref:`Active Record
+      Caching <ar-caching>`.
+   -  Made Active Record fully database-prefix aware.
+
+-  Database drivers
+
+   -  Added support for setting client character set and collation for
+      MySQLi.
+
+-  Core Changes
+
+   -  Modified xss_clean() to be more intelligent with its handling of
+      URL encoded strings.
+   -  Added $_SERVER, $_FILES, $_ENV, and $_SESSION to sanitization
+      of globals.
+   -  Added a `Path Helper <./helpers/path_helper>`.
+   -  Simplified _reindex_segments() in the URI class.
+   -  Escaped the '-' in the default 'permitted_uri_chars' config
+      item, to prevent errors if developers just try to add additional
+      characters to the end of the default expression.
+   -  Modified method calling to controllers to show a 404 when a
+      private or protected method is accessed via a URL.
+   -  Modified framework initiated 404s to log the controller and method
+      for invalid requests.
+
+-  Helpers
+
+   -  Modified get_filenames() in the File Helper to return FALSE if
+      the $source_dir is not readable.
+
+Bugfixes for 1.6.1
+------------------
+
+-  Deprecated is_numeric as a validation rule. Use of numeric and
+   integer are preferred.
+-  Fixed bug (#3379) in DBForge with SQLite for table creation.
+-  Made Active Record fully database prefix aware (#3384).
+-  Fixed a bug where DBForge was outputting invalid SQL in Postgres by
+   adding brackets around the tables in FROM.
+-  Changed the behaviour of Active Record's update() to make the WHERE
+   clause optional (#3395).
+-  Fixed a bug (#3396) where certain POST variables would cause a PHP
+   warning.
+-  Fixed a bug in query binding (#3402).
+-  Changed order of SQL keywords in the Profiler $highlight array so OR
+   would not be highlighted before ORDER BY.
+-  Fixed a bug (#3404) where the MySQLi driver was testing if
+   $this->conn_id was a resource instead of an object.
+-  Fixed a bug (#3419) connecting to a database via a DSN string.
+-  Fixed a bug (#3445) where the routed segment array was not re-indexed
+   to begin with 1 when the default controller is used.
+-  Fixed assorted user guide typos.
+
+Version 1.6.0
+=============
+
+Release Date: January 30, 2008
+
+-  DBForge
+
+   -  Added :doc:`DBForge <./database/forge>` to the database tools.
+   -  Moved create_database() and drop_database() into
+      :doc:`DBForge <./database/forge>`.
+   -  Added add_field(), add_key(), create_table(), drop_table(),
+      add_column(), drop_column(), modify_column() into
+      :doc:`DBForge <./database/forge>`.
+
+-  Active Record
+
+   -  Added protect_identifiers() in :doc:`Active
+      Record <./database/active_record>`.
+   -  All AR queries are backticked if appropriate to the database.
+   -  Added where_in(), or_where_in(), where_not_in(),
+      or_where_not_in(), not_like() and or_not_like() to :doc:`Active
+      Record <./database/active_record>`.
+   -  Added support for limit() into update() and delete() statements in
+      :doc:`Active Record <./database/active_record>`.
+   -  Added empty_table() and truncate_table() to :doc:`Active
+      Record <./database/active_record>`.
+   -  Added the ability to pass an array of tables to the delete()
+      statement in :doc:`Active Record <./database/active_record>`.
+   -  Added count_all_results() function to :doc:`Active
+      Record <./database/active_record>`.
+   -  Added select_max(), select_min(), select_avg() and
+      select_sum() to :doc:`Active Record <./database/active_record>`.
+   -  Added the ability to use aliases with joins in :doc:`Active
+      Record <./database/active_record>`.
+   -  Added a third parameter to Active Record's like() clause to
+      control where the wildcard goes.
+   -  Added a third parameter to set() in :doc:`Active
+      Record <./database/active_record>` that withholds escaping
+      data.
+   -  Changed the behaviour of variables submitted to the where() clause
+      with no values to auto set "IS NULL"
+
+-  Other Database Related
+
+   -  MySQL driver now requires MySQL 4.1+
+   -  Added $this->DB->save_queries variable to DB driver, enabling
+      queries to get saved or not. Previously they were always saved.
+   -  Added $this->db->dbprefix() to manually add database prefixes.
+   -  Added 'random' as an order_by() option , and removed "rand()" as
+      a listed option as it was MySQL only.
+   -  Added a check for NULL fields in the MySQL database backup
+      utility.
+   -  Added "constrain_by_prefix" parameter to db->list_table()
+      function. If set to TRUE it will limit the result to only table
+      names with the current prefix.
+   -  Deprecated from Active Record; getwhere() for get_where();
+      groupby() for group_by(); havingor() for having_or(); orderby()
+      for order_by; orwhere() for or_where(); and orlike() for
+      or_like().
+   -  Modified csv_from_result() to output CSV data more in the spirit
+      of basic rules of RFC 4180.
+   -  Added 'char_set' and 'dbcollat' database configuration settings,
+      to explicitly set the client communication properly.
+   -  Removed 'active_r' configuration setting and replaced with a
+      global $active_record setting, which is more in harmony with the
+      global nature of the behavior (#1834).
+
+-  Core changes
+
+   -  Added ability to load multiple views, whose content will be
+      appended to the output in the order loaded.
+   -  Added the ability to :doc:`auto-load <./general/autoloader>`
+      :doc:`Models <./general/models>`.
+   -  Reorganized the URI and Routes classes for better clarity.
+   -  Added Compat.php to allow function overrides for older versions of
+      PHP or PHP environments missing certain extensions / libraries
+   -  Added memory usage, GET, URI string data, and individual query
+      execution time to Profiler output.
+   -  Deprecated Scaffolding.
+   -  Added is_really_writable() to Common.php to provide a
+      cross-platform reliable method of testing file/folder writability.
+
+-  Libraries
+
+   -  Changed the load protocol of Models to allow for extension.
+   -  Strengthened the Encryption library to help protect against man in
+      the middle attacks when MCRYPT_MODE_CBC mode is used.
+   -  Added Flashdata variables, session_id regeneration and
+      configurable session update times to the :doc:`Session
+      class. <./libraries/sessions>`
+   -  Removed 'last_visit' from the Session class.
+   -  Added a language entry for valid_ip validation error.
+   -  Modified prep_for_form() in the Validation class to accept
+      arrays, adding support for POST array validation (via callbacks
+      only)
+   -  Added an "integer" rule into the Validation library.
+   -  Added valid_base64() to the Validation library.
+   -  Documented clear() in the :doc:`Image
+      Processing <../libraries/image_lib>` library.
+   -  Changed the behaviour of custom callbacks so that they no longer
+      trigger the "required" rule.
+   -  Modified Upload class $_FILES error messages to be more precise.
+   -  Moved the safe mode and auth checks for the Email library into the
+      constructor.
+   -  Modified variable names in _ci_load() method of Loader class to
+      avoid conflicts with view variables.
+   -  Added a few additional mime type variations for CSV.
+   -  Enabled the 'system' methods for the XML-RPC Server library,
+      except for 'system.multicall' which is still disabled.
+
+-  Helpers & Plugins
+
+   -  Added link_tag() to the :doc:`HTML
+      helper. <./helpers/html_helper>`
+   -  Added img() to the :doc:`HTML helper. <./helpers/html_helper>`
+   -  Added ability to :doc:`"extend" Helpers <./general/helpers>`.
+   -  Added an :doc:`email helper <./helpers/email_helper>` into core
+      helpers.
+   -  Added strip_quotes() function to :doc:`string
+      helper <./helpers/string_helper>`.
+   -  Added reduce_multiples() function to :doc:`string
+      helper <./helpers/string_helper>`.
+   -  Added quotes_to_entities() function to :doc:`string
+      helper <./helpers/string_helper>`.
+   -  Added form_fieldset(), form_fieldset_close(), form_label(),
+      and form_reset() function to :doc:`form
+      helper <./helpers/form_helper>`.
+   -  Added support for external urls in form_open().
+   -  Removed support for db_backup in MySQLi due to incompatible
+      functions.
+   -  Javascript Calendar plugin now uses the months and days from the
+      calendar language file, instead of hard-coded values,
+      internationalizing it.
+
+-  Documentation Changes
+
+   -  Added Writing Documentation section
+      for the community to use in writing their own documentation.
+   -  Added titles to all user manual pages.
+   -  Added attributes into <html> of userguide for valid html.
+   -  Added `Zip Encoding
+      Class <http://codeigniter.com/user_guide/libraries/zip>`_ to
+      the table of contents of the userguide.
+   -  Moved part of the userguide menu javascript to an external file.
+   -  Documented distinct() in :doc:`Active
+      Record <./database/active_record>`.
+   -  Documented the timezones() function in the :doc:`Date
+      Helper <./helpers/date_helper>`.
+   -  Documented unset_userdata in the :doc:`Session
+      class <./libraries/sessions>`.
+   -  Documented 2 config options to the :doc:`Database
+      configuration <./database/configuration>` page.
+
+Bug fixes for Version 1.6.0
+---------------------------
+
+-  Fixed a bug (#1813) preventing using $CI->db in the same application
+   with returned database objects.
+-  Fixed a bug (#1842) where the $this->uri->rsegments array would not
+   include the 'index' method if routed to the controller without an
+   implicit method.
+-  Fixed a bug (#1872) where word_limiter() was not retaining
+   whitespace.
+-  Fixed a bug (#1890) in csv_from_result() where content that
+   included the delimiter would break the file.
+-  Fixed a bug (#2542)in the clean_email() method of the Email class to
+   allow for non-numeric / non-sequential array keys.
+-  Fixed a bug (#2545) in _html_entity_decode_callback() when
+   'global_xss_filtering' is enabled.
+-  Fixed a bug (#2668) in the :doc:`parser class <./libraries/parser>`
+   where numeric data was ignored.
+-  Fixed a bug (#2679) where the "previous" pagination link would get
+   drawn on the first page.
+-  Fixed a bug (#2702) in _object_to_array that broke some types of
+   inserts and updates.
+-  Fixed a bug (#2732) in the SQLite driver for PHP 4.
+-  Fixed a bug (#2754) in Pagination to scan for non-positive
+   num_links.
+-  Fixed a bug (#2762) in the :doc:`Session
+   library <./libraries/sessions>` where user agent matching would
+   fail on user agents ending with a space.
+-  Fixed a bug (#2784) $field_names[] vs $Ffield_names[] in postgres
+   and sqlite drivers.
+-  Fixed a bug (#2810) in the typography helper causing extraneous
+   paragraph tags when string contains tags.
+-  Fixed a bug (#2849) where arguments passed to a subfolder controller
+   method would be incorrectly shifted, dropping the 3rd segment value.
+-  Fixed a bug (#2858) which referenced a wrong variable in the Image
+   class.
+-  Fixed a bug (#2875)when loading plugin files as _plugin. and not
+   _pi.
+-  Fixed a bug (#2912) in get_filenames() in the :doc:`File
+   Helper <helpers/file_helper>` where the array wasn't cleared
+   after each call.
+-  Fixed a bug (#2974) in highlight_phrase() that caused an error with
+   slashes.
+-  Fixed a bug (#3003) in the Encryption Library to support modes other
+   than MCRYPT_MODE_ECB
+-  Fixed a bug (#3015) in the :doc:`User Agent
+   library <./libraries/user_agent>` where more then 2 languages
+   where not reported with languages().
+-  Fixed a bug (#3017) in the :doc:`Email <./libraries/email>` library
+   where some timezones were calculated incorrectly.
+-  Fixed a bug (#3024) in which master_dim wasn't getting reset by
+   clear() in the Image library.
+-  Fixed a bug (#3156) in Text Helper highlight_code() causing PHP tags
+   to be handled incorrectly.
+-  Fixed a bug (#3166) that prevented num_rows from working in Oracle.
+-  Fixed a bug (#3175) preventing certain libraries from working
+   properly when autoloaded in PHP 4.
+-  Fixed a bug (#3267) in the Typography Helper where unordered list was
+   listed "un.
+-  Fixed a bug (#3268) where the Router could leave '/' as the path.
+-  Fixed a bug (#3279) where the Email class was sending the wrong
+   Content-Transfer-Encoding for some character sets.
+-  Fixed a bug (#3284) where the rsegment array would not be set
+   properly if the requested URI contained more segments than the routed
+   URI.
+-  Removed extraneous load of $CFG in _display_cache() of the Output
+   class (#3285).
+-  Removed an extraneous call to loading models (#3286).
+-  Fixed a bug (#3310) with sanitization of globals in the Input class
+   that could unset CI's global variables.
+-  Fixed a bug (#3314) which would cause the top level path to be
+   deleted in delete_files() of the File helper.
+-  Fixed a bug (#3328) where the smiley helper might return an undefined
+   variable.
+-  Fixed a bug (#3330) in the FTP class where a comparison wasn't
+   getting made.
+-  Removed an unused parameter from Profiler (#3332).
+-  Fixed a bug in database driver where num_rows property wasn't
+   getting updated.
+-  Fixed a bug in the :doc:`upload
+   library <./libraries/file_uploading>` when allowed_files
+   wasn't defined.
+-  Fixed a bug in word_wrap() of the Text Helper that incorrectly
+   referenced an object.
+-  Fixed a bug in Validation where valid_ip() wasn't called properly.
+-  Fixed a bug in Validation where individual error messages for
+   checkboxes wasn't supported.
+-  Fixed a bug in captcha calling an invalid PHP function.
+-  Fixed a bug in the cookie helper "set_cookie" function. It was not
+   honoring the config settings.
+-  Fixed a bug that was making validation callbacks required even when
+   not set as such.
+-  Fixed a bug in the XML-RPC library so if a type is specified, a more
+   intelligent decision is made as to the default type.
+-  Fixed an example of comma-separated emails in the email library
+   documentation.
+-  Fixed an example in the Calendar library for Showing Next/Previous
+   Month Links.
+-  Fixed a typo in the database language file.
+-  Fixed a typo in the image language file "suppor" to "support".
+-  Fixed an example for XML RPC.
+-  Fixed an example of accept_charset() in the :doc:`User Agent
+   Library <./libraries/user_agent>`.
+-  Fixed a typo in the docblock comments that had CodeIgniter spelled
+   CodeIgnitor.
+-  Fixed a typo in the :doc:`String Helper <./helpers/string_helper>`
+   (uniquid changed to uniqid).
+-  Fixed typos in the email Language class
+   (email_attachment_unredable, email_filed_smtp_login), and FTP
+   Class (ftp_unable_to_remame).
+-  Added a stripslashes() into the Upload Library.
+-  Fixed a series of grammatical and spelling errors in the language
+   files.
+-  Fixed assorted user guide typos.
+
+Version 1.5.4
+=============
+
+Release Date: July 12, 2007
+
+-  Added :doc:`custom Language files <./libraries/language>` to the
+   :doc:`autoload <./general/autoloader>` options.
+-  Added stripslashes() to the _clean_input_data() function in the
+   :doc:`Input class <./libraries/input>` when magic quotes is on so
+   that data will always be un-slashed within the framework.
+-  Added array to string into the :doc:`profiler <general/profiling>`.
+-  Added some additional mime types in application/config/mimes.php.
+-  Added filename_security() method to :doc:`Input
+   library <./libraries/input>`.
+-  Added some additional arguments to the :doc:`Inflection
+   helper <./helpers/inflector_helper>` singular() to compensate
+   for words ending in "s". Also added a force parameter to pluralize().
+-  Added $config['charset'] to the config file. Default value is
+   'UTF-8', used in some string handling functions.
+-  Fixed MSSQL insert_id().
+-  Fixed a logic error in the DB trans_status() function. It was
+   incorrectly returning TRUE on failure and FALSE on success.
+-  Fixed a bug that was allowing multiple load attempts on extended
+   classes.
+-  Fixed a bug in the bootstrap file that was incorrectly attempting to
+   discern the full server path even when it was explicity set by the
+   user.
+-  Fixed a bug in the escape_str() function in the MySQL driver.
+-  Fixed a typo in the :doc:`Calendar library <./libraries/calendar>`
+-  Fixed a typo in rpcs.php library
+-  Fixed a bug in the :doc:`Zip library <./libraries/zip>`, providing
+   PC Zip file compatibility with Mac OS X
+-  Fixed a bug in router that was ignoring the scaffolding route for
+   optimization
+-  Fixed an IP validation bug.
+-  Fixed a bug in display of POST keys in the
+   :doc:`Profiler <./general/profiling>` output
+-  Fixed a bug in display of queries with characters that would be
+   interpreted as HTML in the :doc:`Profiler <./general/profiling>`
+   output
+-  Fixed a bug in display of Email class print debugger with characters
+   that would be interpreted as HTML in the debugging output
+-  Fixed a bug in the Content-Transfer-Encoding of HTML emails with the
+   quoted-printable MIME type
+-  Fixed a bug where one could unset certain PHP superglobals by setting
+   them via GET or POST data
+-  Fixed an undefined function error in the insert_id() function of the
+   PostgreSQL driver
+-  Fixed various doc typos.
+-  Documented two functions from the :doc:`String
+   helper <./helpers/string_helper>` that were missing from the
+   user guide: trim_slashes() and reduce_double_slashes().
+-  Docs now validate to XHTML 1 transitional
+-  Updated the XSS Filtering to take into account the IE expression()
+   ability and improved certain deletions to prevent possible exploits
+-  Modified the Router so that when Query Strings are Enabled, the
+   controller trigger and function trigger values are sanitized for
+   filename include security.
+-  Modified the is_image() method in the Upload library to take into
+   account Windows IE 6/7 eccentricities when dealing with MIMEs
+-  Modified XSS Cleaning routine to be more performance friendly and
+   compatible with PHP 5.2's new PCRE backtrack and recursion limits.
+-  Modified the :doc:`URL Helper <./helpers/url_helper>` to type cast
+   the $title as a string in case a numeric value is supplied
+-  Modified Form Helper form_dropdown() to type cast the keys and
+   values of the options array as strings, allowing numeric values to be
+   properly set as 'selected'
+-  Deprecated the use if is_numeric() in various places since it allows
+   periods. Due to compatibility problems with ctype_digit(), making it
+   unreliable in some installations, the following regular expression
+   was used instead: preg_match("/[^0-9]/", $n)
+-  Deprecated: APPVER has been deprecated and replaced with CI_VERSION
+   for clarity.
+
+Version 1.5.3
+=============
+
+Release Date: April 15, 2007
+
+-  Added array to string into the profiler
+-  Code Igniter references updated to CodeIgniter
+-  pMachine references updated to EllisLab
+-  Fixed a bug in the repeater function of :doc:`string
+   helper <./helpers/string_helper>`.
+-  Fixed a bug in ODBC driver
+-  Fixed a bug in result_array() that was returning an empty array when
+   no result is produced.
+-  Fixed a bug in the redirect function of the :doc:`url
+   helper <./helpers/url_helper>`.
+-  Fixed an undefined variable in Loader
+-  Fixed a version bug in the Postgres driver
+-  Fixed a bug in the textarea function of the form helper for use with
+   strings
+-  Fixed doc typos.
+
+Version 1.5.2
+=============
+
+Release Date: February 13, 2007
+
+-  Added subversion information
+   to the `downloads <installation/downloads>` page.
+-  Added support for captions in the :doc:`Table
+   Library <./libraries/table>`
+-  Fixed a bug in the
+   :doc:`download_helper <helpers/download_helper>` that was causing
+   Internet Explorer to load rather than download
+-  Fixed a bug in the Active Record Join function that was not taking
+   table prefixes into consideration.
+-  Removed unescaped variables in error messages of Input and Router
+   classes
+-  Fixed a bug in the Loader that was causing errors on Libraries loaded
+   twice. A debug message is now silently made in the log.
+-  Fixed a bug in the :doc:`form helper <helpers/form_helper>` that
+   gave textarea a value attribute
+-  Fixed a bug in the :doc:`Image Library <libraries/image_lib>` that
+   was ignoring resizing the same size image
+-  Fixed some doc typos.
+
+Version 1.5.1
+=============
+
+Release Date: November 23, 2006
+
+-  Added support for submitting arrays of libraries in the
+   $this->load->library function.
+-  Added support for naming custom library files in lower or uppercase.
+-  Fixed a bug related to output buffering.
+-  Fixed a bug in the active record class that was not resetting query
+   data after a completed query.
+-  Fixed a bug that was suppressing errors in controllers.
+-  Fixed a problem that can cause a loop to occur when the config file
+   is missing.
+-  Fixed a bug that occurred when multiple models were loaded with the
+   third parameter set to TRUE.
+-  Fixed an oversight that was not unsetting globals properly in the
+   input sanitize function.
+-  Fixed some bugs in the Oracle DB driver.
+-  Fixed an incorrectly named variable in the MySQLi result driver.
+-  Fixed some doc typos.
+
+Version 1.5.0.1
+===============
+
+Release Date: October 31, 2006
+
+-  Fixed a problem in which duplicate attempts to load helpers and
+   classes were not being stopped.
+-  Fixed a bug in the word_wrap() helper function.
+-  Fixed an invalid color Hex number in the Profiler class.
+-  Fixed a corrupted image in the user guide.
+
+Version 1.5.0
+=============
+
+Release Date: October 30, 2006
+
+-  Added `DB utility class <./database/utilities>`, permitting DB
+   backups, CVS or XML files from DB results, and various other
+   functions.
+-  Added :doc:`Database Caching Class <./database/caching>`.
+-  Added :doc:`transaction support <./database/transactions>` to the
+   database classes.
+-  Added :doc:`Profiler Class <./general/profiling>` which generates a
+   report of Benchmark execution times, queries, and POST data at the
+   bottom of your pages.
+-  Added :doc:`User Agent Library <./libraries/user_agent>` which
+   allows browsers, robots, and mobile devises to be identified.
+-  Added :doc:`HTML Table Class <./libraries/table>` , enabling tables
+   to be generated from arrays or database results.
+-  Added :doc:`Zip Encoding Library <./libraries/zip>`.
+-  Added :doc:`FTP Library <./libraries/ftp>`.
+-  Added the ability to :doc:`extend
+   libraries <./general/creating_libraries>` and :doc:`extend core
+   classes <./general/core_classes>`, in addition to being able to
+   replace them.
+-  Added support for storing :doc:`models within
+   sub-folders <./general/models>`.
+-  Added :doc:`Download Helper <./helpers/download_helper>`.
+-  Added :doc:`simple_query() <./database/queries>` function to the
+   database classes
+-  Added :doc:`standard_date() <./helpers/date_helper>` function to
+   the Date Helper.
+-  Added :doc:`$query->free_result() <./database/results>` to database
+   class.
+-  Added :doc:`$query->list_fields() <./database/fields>` function to
+   database class
+-  Added :doc:`$this->db->platform() <./database/helpers>` function
+-  Added new :doc:`File Helper <./helpers/file_helper>`:
+   get_filenames()
+-  Added new helper: :doc:`Smiley Helper <./helpers/smiley_helper>`
+-  Added support for <ul> and <ol> lists in the :doc:`HTML
+   Helper <./helpers/html_helper>`
+-  Added the ability to rewrite :doc:`short
+   tags <./general/alternative_php>` on-the-fly, converting them
+   to standard PHP statements, for those servers that do not support
+   short tags. This allows the cleaner syntax to be used regardless of
+   whether it's supported by the server.
+-  Added the ability to :doc:`rename or relocate the "application"
+   folder <./general/managing_apps>`.
+-  Added more thorough initialization in the upload class so that all
+   class variables are reset.
+-  Added "is_numeric" to validation, which uses the native PHP
+   is_numeric function.
+-  Improved the URI handler to make it more reliable when the
+   $config['uri_protocol'] item is set to AUTO.
+-  Moved most of the functions in the Controller class into the Loader
+   class, allowing fewer reserved function names for controllers when
+   running under PHP 5.
+-  Updated the DB Result class to return an empty array when
+   $query->result() doesn't produce a result.
+-  Updated the input->cookie() and input->post() functions in :doc:`Input
+   Class <./libraries/input>` to permit arrays contained cookies
+   that are arrays to be run through the XSS filter.
+-  Documented three functions from the Validation
+   class that were missing from the user
+   guide: set_select(), set_radio(), and set_checkbox().
+-  Fixed a bug in the Email class related to SMTP Helo data.
+-  Fixed a bug in the word wrapping helper and function in the email
+   class.
+-  Fixed a bug in the validation class.
+-  Fixed a bug in the typography helper that was incorrectly wrapping
+   block level elements in paragraph tags.
+-  Fixed a problem in the form_prep() function that was double encoding
+   entities.
+-  Fixed a bug that affects some versions of PHP when output buffering
+   is nested.
+-  Fixed a bug that caused CI to stop working when the PHP magic
+   __get() or __set() functions were used within models or
+   controllers.
+-  Fixed a pagination bug that was permitting negative values in the
+   URL.
+-  Fixed an oversight in which the Loader class was not allowed to be
+   extended.
+-  Changed _get_config() to get_config() since the function is not a
+   private one.
+-  **Deprecated "init" folder**. Initialization happens automatically
+   now. :doc:`Please see documentation <./general/creating_libraries>`.
+-  **Deprecated** $this->db->field_names() USE
+   $this->db->list_fields()
+-  **Deprecated** the $config['log_errors'] item from the config.php
+   file. Instead, $config['log_threshold'] can be set to "0" to turn it
+   off.
+
+Version 1.4.1
+=============
+
+Release Date: September 21, 2006
+
+-  Added a new feature that passes URI segments directly to your
+   function calls as parameters. See the
+   :doc:`Controllers <general/controllers>` page for more info.
+-  Added support for a function named _output(), which when used in
+   your controllers will received the final rendered output from the
+   output class. More info in the :doc:`Controllers <general/controllers>`
+   page.
+-  Added several new functions in the :doc:`URI
+   Class <./libraries/uri>` to let you retrieve and manipulate URI
+   segments that have been re-routed using the :doc:`URI
+   Routing <general/routing>` feature. Previously, the URI class did not
+   permit you to access any re-routed URI segments, but now it does.
+-  Added :doc:`$this->output->set_header() <./libraries/output>`
+   function, which allows you to set server headers.
+-  Updated plugins, helpers, and language classes to allow your
+   application folder to contain its own plugins, helpers, and language
+   folders. Previously they were always treated as global for your
+   entire installation. If your application folder contains any of these
+   resources they will be used *instead* the global ones.
+-  Added :doc:`Inflector helper <./helpers/inflector_helper>`.
+-  Added element() function in the :doc:`array
+   helper <./helpers/array_helper>`.
+-  Added RAND() to active record orderby() function.
+-  Added delete_cookie() and get_cookie() to :doc:`Cookie
+   helper <./helpers/cookie_helper>`, even though the input class
+   has a cookie fetching function.
+-  Added Oracle database driver (still undergoing testing so it might
+   have some bugs).
+-  Added the ability to combine pseudo-variables and php variables in
+   the template parser class.
+-  Added output compression option to the config file.
+-  Removed the is_numeric test from the db->escape() function.
+-  Fixed a MySQLi bug that was causing error messages not to contain
+   proper error data.
+-  Fixed a bug in the email class which was causing it to ignore
+   explicitly set alternative headers.
+-  Fixed a bug that was causing a PHP error when the Exceptions class
+   was called within the get_config() function since it was causing
+   problems.
+-  Fixed an oversight in the cookie helper in which the config file
+   cookie settings were not being honored.
+-  Fixed an oversight in the upload class. An item mentioned in the 1.4
+   changelog was missing.
+-  Added some code to allow email attachments to be reset when sending
+   batches of email.
+-  Deprecated the application/scripts folder. It will continue to work
+   for legacy users, but it is recommended that you create your own
+   :doc:`libraries <./general/libraries>` or
+   :doc:`models <./general/models>` instead. It was originally added
+   before CI had user libraries or models, but it's not needed anymore.
+-  Deprecated the $autoload['core'] item from the autoload.php file.
+   Instead, please now use: $autoload['libraries']
+-  Deprecated the following database functions:
+   $this->db->smart_escape_str() and $this->db->fields().
+
+Version 1.4.0
+=============
+
+Release Date: September 17, 2006
+
+-  Added :doc:`Hooks <./general/hooks>` feature, enabling you to tap
+   into and modify the inner workings of the framework without hacking
+   the core files.
+-  Added the ability to organize controller files :doc:`into
+   sub-folders <general/controllers>`. Kudos to Marco for
+   `suggesting <http://codeigniter.com/forums/viewthread/627/>`_ this
+   (and the next two) feature.
+-  Added regular expressions support for `routing
+   rules <./general/routing>`.
+-  Added the ability to :doc:`remap function
+   calls <./general/controllers>` within your controllers.
+-  Added the ability to :doc:`replace core system
+   classes <./general/core_classes>` with your own classes.
+-  Added support for % character in URL.
+-  Added the ability to supply full URLs using the
+   :doc:`anchor() <./helpers/url_helper>` helper function.
+-  Added mode parameter to :doc:`file_write() <./helpers/file_helper>`
+   helper.
+-  Added support for changing the port number in the :doc:`Postgres
+   driver <./database/configuration>`.
+-  Moved the list of "allowed URI characters" out of the Router class
+   and into the config file.
+-  Moved the MIME type array out of the Upload class and into its own
+   file in the applications/config/ folder.
+-  Updated the Upload class to allow the upload field name to be set
+   when calling :doc:`do_upload() <./libraries/file_uploading>`.
+-  Updated the :doc:`Config Library <./libraries/config>` to be able to
+   load config files silently, and to be able to assign config files to
+   their own index (to avoid collisions if you use multiple config
+   files).
+-  Updated the URI Protocol code to allow more options so that URLs will
+   work more reliably in different environments.
+-  Updated the form_open() helper to allow the GET method to be used.
+-  Updated the MySQLi execute() function with some code to help prevent
+   lost connection errors.
+-  Updated the SQLite Driver to check for object support before
+   attempting to return results as objects. If unsupported it returns an
+   array.
+-  Updated the Models loader function to allow multiple loads of the
+   same model.
+-  Updated the MS SQL driver so that single quotes are escaped.
+-  Updated the Postgres and ODBC drivers for better compatibility.
+-  Removed a strtolower() call that was changing URL segments to lower
+   case.
+-  Removed some references that were interfering with PHP 4.4.1
+   compatibility.
+-  Removed backticks from Postgres class since these are not needed.
+-  Renamed display() to _display() in the Output class to make it clear
+   that it's a private function.
+-  Deprecated the hash() function due to a naming conflict with a native
+   PHP function with the same name. Please use dohash() instead.
+-  Fixed an bug that was preventing the input class from unsetting GET
+   variables.
+-  Fixed a router bug that was making it too greedy when matching end
+   segments.
+-  Fixed a bug that was preventing multiple discrete database calls.
+-  Fixed a bug in which loading a language file was producing a "file
+   contains no data" message.
+-  Fixed a session bug caused by the XSS Filtering feature inadvertently
+   changing the case of certain words.
+-  Fixed some missing prefixes when using the database prefix feature.
+-  Fixed a typo in the Calendar class (cal_november).
+-  Fixed a bug in the form_checkbox() helper.
+-  Fixed a bug that was allowing the second segment of the URI to be
+   identical to the class name.
+-  Fixed an evaluation bug in the database initialization function.
+-  Fixed a minor bug in one of the error messages in the language class.
+-  Fixed a bug in the date helper timespan function.
+-  Fixed an undefined variable in the DB Driver class.
+-  Fixed a bug in which dollar signs used as binding replacement values
+   in the DB class would be treated as RegEx back-references.
+-  Fixed a bug in the set_hash() function which was preventing MD5 from
+   being used.
+-  Fixed a couple bugs in the Unit Testing class.
+-  Fixed an incorrectly named variable in the Validation class.
+-  Fixed an incorrectly named variable in the URI class.
+-  Fixed a bug in the config class that was preventing the base URL from
+   being called properly.
+-  Fixed a bug in the validation class that was not permitting callbacks
+   if the form field was empty.
+-  Fixed a problem that was preventing scaffolding from working properly
+   with MySQLi.
+-  Fixed some MS SQL bugs.
+-  Fixed some doc typos.
+
+Version 1.3.3
+=============
+
+Release Date: June 1, 2006
+
+-  Models do **not** connect automatically to the database as of this
+   version. :doc:`More info here <./general/models>`.
+-  Updated the Sessions class to utilize the active record class when
+   running session related queries. Previously the queries assumed MySQL
+   syntax.
+-  Updated alternator() function to re-initialize when called with no
+   arguments, allowing multiple calls.
+-  Fixed a bug in the active record "having" function.
+-  Fixed a problem in the validation class which was making checkboxes
+   be ignored when required.
+-  Fixed a bug in the word_limiter() helper function. It was cutting
+   off the fist word.
+-  Fixed a bug in the xss_clean function due to a PHP bug that affects
+   some versions of html_entity_decode.
+-  Fixed a validation bug that was preventing rules from being set twice
+   in one controller.
+-  Fixed a calendar bug that was not letting it use dynamically loaded
+   languages.
+-  Fixed a bug in the active record class when using WHERE clauses with
+   LIKE
+-  Fixed a bug in the hash() security helper.
+-  Fixed some typos.
+
+Version 1.3.2
+=============
+
+Release Date: April 17, 2006
+
+-  Changed the behavior of the validation class such that if a
+   "required" rule is NOT explicitly stated for a field then all other
+   tests get ignored.
+-  Fixed a bug in the Controller class that was causing it to look in
+   the local "init" folder instead of the main system one.
+-  Fixed a bug in the init_pagination file. The $config item was not
+   being set correctly.
+-  Fixed a bug in the auto typography helper that was causing
+   inconsistent behavior.
+-  Fixed a couple bugs in the Model class.
+-  Fixed some documentation typos and errata.
+
+Version 1.3.1
+=============
+
+Release Date: April 11, 2006
+
+-  Added a :doc:`Unit Testing Library <./libraries/unit_testing>`.
+-  Added the ability to pass objects to the **insert()** and
+   **update()** database functions. This feature enables you to (among
+   other things) use your :doc:`Model class <./general/models>`
+   variables to run queries with. See the Models page for details.
+-  Added the ability to pass objects to the :doc:`view loading
+   function <./general/views>`: $this->load->view('my_view',
+   $object);
+-  Added getwhere function to :doc:`Active Record
+   class <./database/active_record>`.
+-  Added count_all function to :doc:`Active Record
+   class <./database/active_record>`.
+-  Added language file for scaffolding and fixed a scaffolding bug that
+   occurs when there are no rows in the specified table.
+-  Added :doc:`$this->db->last_query() <./database/queries>`, which
+   allows you to view your last query that was run.
+-  Added a new mime type to the upload class for better compatibility.
+-  Changed how cache files are read to prevent PHP errors if the cache
+   file contains an XML tag, which PHP wants to interpret as a short
+   tag.
+-  Fixed a bug in a couple of the active record functions (where and
+   orderby).
+-  Fixed a bug in the image library when realpath() returns false.
+-  Fixed a bug in the Models that was preventing libraries from being
+   used within them.
+-  Fixed a bug in the "exact_length" function of the validation class.
+-  Fixed some typos in the user guide
+
+Version 1.3
+===========
+
+Release Date: April 3, 2006
+
+-  Added support for :doc:`Models <general/models>`.
+-  Redesigned the database libraries to support additional RDBMs
+   (Postgres, MySQLi, etc.).
+-  Redesigned the :doc:`Active Record class <./database/active_record>`
+   to enable more varied types of queries with simpler syntax, and
+   advanced features like JOINs.
+-  Added a feature to the database class that lets you run :doc:`custom
+   function calls <./database/call_function>`.
+-  Added support for :doc:`private functions <general/controllers>` in your
+   controllers. Any controller function name that starts with an
+   underscore will not be served by a URI request.
+-  Added the ability to pass your own initialization parameters to your
+   :doc:`custom core libraries <general/creating_libraries>` when using
+   $this->load->library()
+-  Added support for running standard :doc:`query string URLs <general/urls>`.
+   These can be optionally enabled in your config file.
+-  Added the ability to :doc:`specify a "suffix" <general/urls>`, which will be
+   appended to your URLs. For example, you could add .html to your URLs,
+   making them appear static. This feature is enabled in your config
+   file.
+-  Added a new error template for use with native PHP errors.
+-  Added "alternator" function in the :doc:`string
+   helpers <./helpers/string_helper>`.
+-  Removed slashing from the input class. After much debate we decided
+   to kill this feature.
+-  Change the commenting style in the scripts to the PEAR standard so
+   that IDEs and tools like phpDocumenter can harvest the comments.
+-  Added better class and function name-spacing to avoid collisions with
+   user developed classes. All CodeIgniter classes are now prefixed with
+   CI\_ and all controller methods are prefixed with _ci to avoid
+   controller collisions. A list of reserved function names can be
+   :doc:`found here <general/controllers>`.
+-  Redesigned how the "CI" super object is referenced, depending on
+   whether PHP 4 or 5 is being run, since PHP 5 allows a more graceful
+   way to manage objects that utilizes a bit less resources.
+-  Deprecated: $this->db->use_table() has been deprecated. Please read
+   the :doc:`Active Record <./database/active_record>` page for
+   information.
+-  Deprecated: $this->db->smart_escape_str() has been deprecated.
+   Please use this instead: $this->db->escape()
+-  Fixed a bug in the exception handler which was preventing some PHP
+   errors from showing up.
+-  Fixed a typo in the URI class. $this->total_segment() should be
+   plural: $this->total_segments()
+-  Fixed some typos in the default calendar template
+-  Fixed some typos in the user guide
+
+Version 1.2
+===========
+
+Release Date: March 21, 2006
+
+-  Redesigned some internal aspects of the framework to resolve scoping
+   problems that surfaced during the beta tests. The problem was most
+   notable when instantiating classes in your constructors, particularly
+   if those classes in turn did work in their constructors.
+-  Added a global function named
+   :doc:`get_instance() <general/ancillary_classes>` allowing the main
+   CodeIgniter object to be accessible throughout your own classes.
+-  Added new :doc:`File Helper <./helpers/file_helper>`:
+   delete_files()
+-  Added new :doc:`URL Helpers <./helpers/url_helper>`: base_url(),
+   index_page()
+-  Added the ability to create your own :doc:`core
+   libraries <general/creating_libraries>` and store them in your local
+   application directory.
+-  Added an overwrite option to the :doc:`Upload
+   class <./libraries/file_uploading>`, enabling files to be
+   overwritten rather than having the file name appended.
+-  Added Javascript Calendar plugin.
+-  Added search feature to user guide. Note: This is done using Google,
+   which at the time of this writing has not crawled all the pages of
+   the docs.
+-  Updated the parser class so that it allows tag pars within other tag
+   pairs.
+-  Fixed a bug in the DB "where" function.
+-  Fixed a bug that was preventing custom config files to be
+   auto-loaded.
+-  Fixed a bug in the mysql class bind feature that prevented question
+   marks in the replacement data.
+-  Fixed some bugs in the xss_clean function
+
+Version Beta 1.1
+================
+
+Release Date: March 10, 2006
+
+-  Added a :doc:`Calendaring class <./libraries/calendar>`.
+-  Added support for running :doc:`multiple
+   applications <general/managing_apps>` that share a common CodeIgniter
+   backend.
+-  Moved the "uri protocol" variable from the index.php file into the
+   config.php file
+-  Fixed a problem that was preventing certain function calls from
+   working within constructors.
+-  Fixed a problem that was preventing the $this->load->library function
+   from working in constructors.
+-  Fixed a bug that occurred when the session class was loaded using the
+   auto-load routine.
+-  Fixed a bug that can happen with PHP versions that do not support the
+   E_STRICT constant
+-  Fixed a data type error in the form_radio function (form helper)
+-  Fixed a bug that was preventing the xss_clean function from being
+   called from the validation class.
+-  Fixed the cookie related config names, which were incorrectly
+   specified as $conf rather than $config
+-  Fixed a pagination problem in the scaffolding.
+-  Fixed a bug in the mysql class "where" function.
+-  Fixed a regex problem in some code that trimmed duplicate slashes.
+-  Fixed a bug in the br() function in the HTML helper
+-  Fixed a syntax mistake in the form_dropdown function in the Form
+   Helper.
+-  Removed the "style" attributes form the form helpers.
+-  Updated the documentation. Added "next/previous" links to each page
+   and fixed various typos.
+
+Version Beta 1.0
+================
+
+Release Date: February 28, 2006
+
+First publicly released version.
diff --git a/user_guide_src/source/conf.py b/user_guide_src/source/conf.py
new file mode 100644
index 0000000..cb28d21
--- /dev/null
+++ b/user_guide_src/source/conf.py
@@ -0,0 +1,257 @@
+# -*- coding: utf-8 -*-
+#
+# CodeIgniter documentation build configuration file, created by
+# sphinx-quickstart on Sun Aug 28 07:24:38 2011.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.ifconfig', 'sphinxcontrib.phpdomain']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'CodeIgniter'
+copyright = u'2011, EllisLab, Inc.'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '2.1'
+# The full version, including alpha/beta/rc tags.
+release = '2.1.0'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'trac'
+highlight_language = 'ci'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'eldocs'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+html_theme_path = ["./_themes"]
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'CodeIgniterdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'CodeIgniter.tex', u'CodeIgniter Documentation',
+   u'EllisLab, Inc.', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'codeigniter', u'CodeIgniter Documentation',
+     [u'EllisLab, Inc.'], 1)
+]
+
+
+# -- Options for Epub output ---------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = u'CodeIgniter'
+epub_author = u'EllisLab, Inc.'
+epub_publisher = u'EllisLab, Inc.'
+epub_copyright = u'2011, EllisLab, Inc.'
+
+# The language of the text. It defaults to the language option
+# or en if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+#epub_exclude_files = []
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
diff --git a/user_guide_src/source/database/active_record.rst b/user_guide_src/source/database/active_record.rst
new file mode 100644
index 0000000..e1fc00b
--- /dev/null
+++ b/user_guide_src/source/database/active_record.rst
@@ -0,0 +1,856 @@
+###################
+Active Record Class
+###################
+
+CodeIgniter uses a modified version of the Active Record Database
+Pattern. This pattern allows information to be retrieved, inserted, and
+updated in your database with minimal scripting. In some cases only one
+or two lines of code are necessary to perform a database action.
+CodeIgniter does not require that each database table be its own class
+file. It instead provides a more simplified interface.
+
+Beyond simplicity, a major benefit to using the Active Record features
+is that it allows you to create database independent applications, since
+the query syntax is generated by each database adapter. It also allows
+for safer queries, since the values are escaped automatically by the
+system.
+
+.. note:: If you intend to write your own queries you can disable this
+	class in your database config file, allowing the core database library
+	and adapter to utilize fewer resources.
+
+.. contents:: Page Contents
+
+**************
+Selecting Data
+**************
+
+The following functions allow you to build SQL **SELECT** statements.
+
+$this->db->get()
+================
+
+Runs the selection query and returns the result. Can be used by itself
+to retrieve all records from a table::
+
+	$query = $this->db->get('mytable');  // Produces: SELECT * FROM mytable
+
+The second and third parameters enable you to set a limit and offset
+clause::
+
+	$query = $this->db->get('mytable', 10, 20);
+	// Produces: SELECT * FROM mytable LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
+
+You'll notice that the above function is assigned to a variable named
+$query, which can be used to show the results::
+
+	$query = $this->db->get('mytable');
+	
+	foreach ($query->result() as $row)
+	{
+		echo $row->title;
+	}
+
+Please visit the :doc:`result functions <results>` page for a full
+discussion regarding result generation.
+
+$this->db->get_where()
+======================
+
+Identical to the above function except that it permits you to add a
+"where" clause in the second parameter, instead of using the db->where()
+function::
+
+	$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);
+
+Please read the about the where function below for more information.
+
+Note: get_where() was formerly known as getwhere(), which has been
+removed
+
+$this->db->select()
+===================
+
+Permits you to write the SELECT portion of your query::
+
+	$this->db->select('title, content, date');
+	$query = $this->db->get('mytable');  // Produces: SELECT title, content, date FROM mytable
+
+
+.. note:: If you are selecting all (\*) from a table you do not need to
+	use this function. When omitted, CodeIgniter assumes you wish to SELECT *
+
+$this->db->select() accepts an optional second parameter. If you set it
+to FALSE, CodeIgniter will not try to protect your field or table names
+with backticks. This is useful if you need a compound select statement.
+
+::
+
+	$this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE); 
+	$query = $this->db->get('mytable');
+
+
+$this->db->select_max()
+=======================
+
+Writes a "SELECT MAX(field)" portion for your query. You can optionally
+include a second parameter to rename the resulting field.
+
+::
+
+	$this->db->select_max('age');
+	$query = $this->db->get('members');  // Produces: SELECT MAX(age) as age FROM members
+	
+	$this->db->select_max('age', 'member_age');
+	$query = $this->db->get('members'); // Produces: SELECT MAX(age) as member_age FROM members
+
+
+$this->db->select_min()
+=======================
+
+Writes a "SELECT MIN(field)" portion for your query. As with
+select_max(), You can optionally include a second parameter to rename
+the resulting field.
+
+::
+
+	$this->db->select_min('age');
+	$query = $this->db->get('members'); // Produces: SELECT MIN(age) as age FROM members
+
+
+$this->db->select_avg()
+=======================
+
+Writes a "SELECT AVG(field)" portion for your query. As with
+select_max(), You can optionally include a second parameter to rename
+the resulting field.
+
+::
+
+	$this->db->select_avg('age');
+	$query = $this->db->get('members'); // Produces: SELECT AVG(age) as age FROM members
+
+
+$this->db->select_sum()
+=======================
+
+Writes a "SELECT SUM(field)" portion for your query. As with
+select_max(), You can optionally include a second parameter to rename
+the resulting field.
+
+::
+
+	$this->db->select_sum('age');
+	$query = $this->db->get('members'); // Produces: SELECT SUM(age) as age FROM members
+
+
+$this->db->from()
+=================
+
+Permits you to write the FROM portion of your query::
+
+	$this->db->select('title, content, date');
+	$this->db->from('mytable');
+	$query = $this->db->get();  // Produces: SELECT title, content, date FROM mytable
+
+.. note:: As shown earlier, the FROM portion of your query can be specified
+	in the $this->db->get() function, so use whichever method you prefer.
+
+$this->db->join()
+=================
+
+Permits you to write the JOIN portion of your query::
+
+	$this->db->select('*');
+	$this->db->from('blogs');
+	$this->db->join('comments', 'comments.id = blogs.id');
+	$query = $this->db->get();
+	
+	// Produces:
+	// SELECT * FROM blogs // JOIN comments ON comments.id = blogs.id
+
+Multiple function calls can be made if you need several joins in one
+query.
+
+If you need a specific type of JOIN you can specify it via the third
+parameter of the function. Options are: left, right, outer, inner, left
+outer, and right outer.
+
+::
+
+	$this->db->join('comments', 'comments.id = blogs.id', 'left');
+	// Produces: LEFT JOIN comments ON comments.id = blogs.id
+
+$this->db->where()
+==================
+
+This function enables you to set **WHERE** clauses using one of four
+methods:
+
+.. note:: All values passed to this function are escaped automatically,
+	producing safer queries.
+
+#. **Simple key/value method:**
+
+	::
+
+		$this->db->where('name', $name); // Produces: WHERE name = 'Joe' 
+
+	Notice that the equal sign is added for you.
+
+	If you use multiple function calls they will be chained together with
+	AND between them:
+
+	::
+
+		$this->db->where('name', $name);
+		$this->db->where('title', $title);
+		$this->db->where('status', $status);
+		// WHERE name = 'Joe' AND title = 'boss' AND status = 'active'  
+
+#. **Custom key/value method:**
+	You can include an operator in the first parameter in order to
+	control the comparison:
+
+	::
+
+		$this->db->where('name !=', $name);
+		$this->db->where('id <', $id); // Produces: WHERE name != 'Joe' AND id < 45    
+
+#. **Associative array method:**
+
+	::
+
+		$array = array('name' => $name, 'title' => $title, 'status' => $status);
+		$this->db->where($array);
+		// Produces: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'    
+
+	You can include your own operators using this method as well:
+
+	::
+
+		$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);
+		$this->db->where($array);
+
+#. **Custom string:**
+	You can write your own clauses manually::
+
+		$where = "name='Joe' AND status='boss' OR status='active'";
+		$this->db->where($where);
+
+
+$this->db->where() accepts an optional third parameter. If you set it to
+FALSE, CodeIgniter will not try to protect your field or table names
+with backticks.
+
+::
+
+	$this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);
+
+
+$this->db->or_where()
+=====================
+
+This function is identical to the one above, except that multiple
+instances are joined by OR::
+
+	$this->db->where('name !=', $name);
+	$this->db->or_where('id >', $id);  // Produces: WHERE name != 'Joe' OR id > 50
+
+.. note:: or_where() was formerly known as orwhere(), which has been
+	removed.
+
+$this->db->where_in()
+=====================
+
+Generates a WHERE field IN ('item', 'item') SQL query joined with AND if
+appropriate
+
+::
+
+	$names = array('Frank', 'Todd', 'James');
+	$this->db->where_in('username', $names);
+	// Produces: WHERE username IN ('Frank', 'Todd', 'James')
+
+
+$this->db->or_where_in()
+========================
+
+Generates a WHERE field IN ('item', 'item') SQL query joined with OR if
+appropriate
+
+::
+
+	$names = array('Frank', 'Todd', 'James');
+	$this->db->or_where_in('username', $names);
+	// Produces: OR username IN ('Frank', 'Todd', 'James')
+
+
+$this->db->where_not_in()
+=========================
+
+Generates a WHERE field NOT IN ('item', 'item') SQL query joined with
+AND if appropriate
+
+::
+
+	$names = array('Frank', 'Todd', 'James');
+	$this->db->where_not_in('username', $names);
+	// Produces: WHERE username NOT IN ('Frank', 'Todd', 'James')
+
+
+$this->db->or_where_not_in()
+============================
+
+Generates a WHERE field NOT IN ('item', 'item') SQL query joined with OR
+if appropriate
+
+::
+
+	$names = array('Frank', 'Todd', 'James');
+	$this->db->or_where_not_in('username', $names);
+	// Produces: OR username NOT IN ('Frank', 'Todd', 'James')
+
+
+$this->db->like()
+=================
+
+This function enables you to generate **LIKE** clauses, useful for doing
+searches.
+
+.. note:: All values passed to this function are escaped automatically.
+
+#. **Simple key/value method:**
+
+	::
+
+		$this->db->like('title', 'match');     // Produces: WHERE title LIKE '%match%' 
+
+	If you use multiple function calls they will be chained together with
+	AND between them::
+
+		$this->db->like('title', 'match');
+		$this->db->like('body', 'match');
+		// WHERE title LIKE '%match%' AND  body LIKE '%match%
+
+	If you want to control where the wildcard (%) is placed, you can use
+	an optional third argument. Your options are 'before', 'after' and
+	'both' (which is the default).
+
+	::
+
+		$this->db->like('title', 'match', 'before');	// Produces: WHERE title LIKE '%match'
+		$this->db->like('title', 'match', 'after');		// Produces: WHERE title LIKE 'match%'
+		$this->db->like('title', 'match', 'both');		// Produces: WHERE title LIKE '%match%' 
+
+#. **Associative array method:**
+
+	::
+
+		$array = array('title' => $match, 'page1' => $match, 'page2' => $match);
+		$this->db->like($array);
+		// WHERE title LIKE '%match%' AND  page1 LIKE '%match%' AND  page2 LIKE '%match%'
+
+
+$this->db->or_like()
+====================
+
+This function is identical to the one above, except that multiple
+instances are joined by OR::
+
+	$this->db->like('title', 'match'); $this->db->or_like('body', $match);
+	// WHERE title LIKE '%match%' OR  body LIKE '%match%'
+
+.. note:: or_like() was formerly known as orlike(), which has been removed.
+
+$this->db->not_like()
+=====================
+
+This function is identical to **like()**, except that it generates NOT
+LIKE statements::
+
+	$this->db->not_like('title', 'match');  // WHERE title NOT LIKE '%match%
+
+$this->db->or_not_like()
+========================
+
+This function is identical to **not_like()**, except that multiple
+instances are joined by OR::
+
+	$this->db->like('title', 'match');
+	$this->db->or_not_like('body', 'match');
+	// WHERE title  LIKE '%match% OR body NOT LIKE '%match%'
+
+$this->db->group_by()
+=====================
+
+Permits you to write the GROUP BY portion of your query::
+
+	$this->db->group_by("title"); // Produces: GROUP BY title
+
+You can also pass an array of multiple values as well::
+
+	$this->db->group_by(array("title", "date"));  // Produces: GROUP BY title, date
+
+.. note:: group_by() was formerly known as groupby(), which has been
+	removed.
+
+$this->db->distinct()
+=====================
+
+Adds the "DISTINCT" keyword to a query
+
+::
+
+	$this->db->distinct();
+	$this->db->get('table'); // Produces: SELECT DISTINCT * FROM table
+
+
+$this->db->having()
+===================
+
+Permits you to write the HAVING portion of your query. There are 2
+possible syntaxes, 1 argument or 2::
+
+	$this->db->having('user_id = 45');  // Produces: HAVING user_id = 45
+	$this->db->having('user_id',  45);  // Produces: HAVING user_id = 45 
+
+You can also pass an array of multiple values as well::
+
+	$this->db->having(array('title =' => 'My Title', 'id <' => $id));
+	// Produces: HAVING title = 'My Title', id < 45
+
+
+If you are using a database that CodeIgniter escapes queries for, you
+can prevent escaping content by passing an optional third argument, and
+setting it to FALSE.
+
+::
+
+	$this->db->having('user_id',  45);  // Produces: HAVING `user_id` = 45 in some databases such as MySQL
+	$this->db->having('user_id',  45, FALSE);  // Produces: HAVING user_id = 45
+
+
+$this->db->or_having()
+======================
+
+Identical to having(), only separates multiple clauses with "OR".
+
+$this->db->order_by()
+=====================
+
+Lets you set an ORDER BY clause. The first parameter contains the name
+of the column you would like to order by. The second parameter lets you
+set the direction of the result. Options are asc or desc, or random.
+
+::
+
+	$this->db->order_by("title", "desc");  // Produces: ORDER BY title DESC
+
+You can also pass your own string in the first parameter::
+
+	$this->db->order_by('title desc, name asc');  // Produces: ORDER BY title DESC, name ASC
+
+Or multiple function calls can be made if you need multiple fields.
+
+::
+
+	$this->db->order_by("title", "desc");
+	$this->db->order_by("name", "asc"); // Produces: ORDER BY title DESC, name ASC     
+
+
+.. note:: order_by() was formerly known as orderby(), which has been
+	removed.
+
+.. note:: random ordering is not currently supported in Oracle or MSSQL
+	drivers. These will default to 'ASC'.
+
+$this->db->limit()
+==================
+
+Lets you limit the number of rows you would like returned by the query::
+
+	$this->db->limit(10);  // Produces: LIMIT 10
+
+The second parameter lets you set a result offset.
+
+::
+
+	$this->db->limit(10, 20);  // Produces: LIMIT 20, 10 (in MySQL.  Other databases have slightly different syntax)
+
+$this->db->count_all_results()
+==============================
+
+Permits you to determine the number of rows in a particular Active
+Record query. Queries will accept Active Record restrictors such as
+where(), or_where(), like(), or_like(), etc. Example::
+
+	echo $this->db->count_all_results('my_table');  // Produces an integer, like 25
+	$this->db->like('title', 'match');
+	$this->db->from('my_table');
+	echo $this->db->count_all_results(); // Produces an integer, like 17 
+
+$this->db->count_all()
+======================
+
+Permits you to determine the number of rows in a particular table.
+Submit the table name in the first parameter. Example::
+
+	echo $this->db->count_all('my_table');  // Produces an integer, like 25
+
+**************
+Inserting Data
+**************
+
+$this->db->insert()
+===================
+
+Generates an insert string based on the data you supply, and runs the
+query. You can either pass an **array** or an **object** to the
+function. Here is an example using an array::
+
+	$data = array(
+		'title' => 'My title',
+		'name' => 'My Name',
+		'date' => 'My date'
+	);
+	
+	$this->db->insert('mytable', $data);
+	// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
+
+The first parameter will contain the table name, the second is an
+associative array of values.
+
+Here is an example using an object::
+
+	/*
+	class Myclass {
+		var  $title = 'My Title';
+		var  $content = 'My Content';
+		var  $date = 'My Date';
+	}
+	*/
+	
+	$object = new Myclass;
+	$this->db->insert('mytable', $object);
+	// Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')
+
+The first parameter will contain the table name, the second is an
+object.
+
+.. note:: All values are escaped automatically producing safer queries.
+
+$this->db->insert_batch()
+=========================
+
+Generates an insert string based on the data you supply, and runs the
+query. You can either pass an **array** or an **object** to the
+function. Here is an example using an array::
+
+	$data = array(
+		array(
+			'title' => 'My title',
+			'name' => 'My Name',
+			'date' => 'My date'
+		),
+		array(
+			'title' => 'Another title',
+			'name' => 'Another Name',
+			'date' => 'Another date'
+		)
+	);
+	
+	$this->db->insert_batch('mytable', $data);
+	// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'),  ('Another title', 'Another name', 'Another date')
+
+The first parameter will contain the table name, the second is an
+associative array of values.
+
+.. note:: All values are escaped automatically producing safer queries.
+
+$this->db->set()
+================
+
+This function enables you to set values for inserts or updates.
+
+**It can be used instead of passing a data array directly to the insert
+or update functions:**
+
+::
+
+	$this->db->set('name', $name);
+	$this->db->insert('mytable');  // Produces: INSERT INTO mytable (name) VALUES ('{$name}')
+
+If you use multiple function called they will be assembled properly
+based on whether you are doing an insert or an update::
+
+	$this->db->set('name', $name);
+	$this->db->set('title', $title);
+	$this->db->set('status', $status);
+	$this->db->insert('mytable'); 
+
+**set()** will also accept an optional third parameter ($escape), that
+will prevent data from being escaped if set to FALSE. To illustrate the
+difference, here is set() used both with and without the escape
+parameter.
+
+::
+
+	$this->db->set('field', 'field+1', FALSE);
+	$this->db->insert('mytable'); // gives INSERT INTO mytable (field) VALUES (field+1)
+	$this->db->set('field', 'field+1');
+	$this->db->insert('mytable'); // gives INSERT INTO mytable (field) VALUES ('field+1')
+
+
+You can also pass an associative array to this function::
+
+	$array = array(
+		'name' => $name,
+		'title' => $title,
+		'status' => $status
+	);
+	
+	$this->db->set($array);
+	$this->db->insert('mytable');
+
+Or an object::
+
+	/*
+	class Myclass {
+		var  $title = 'My Title';
+		var  $content = 'My Content';
+		var  $date = 'My Date';
+	}
+	*/
+	
+	$object = new Myclass;
+	$this->db->set($object);
+	$this->db->insert('mytable');
+
+
+*************
+Updating Data
+*************
+
+$this->db->update()
+===================
+
+Generates an update string and runs the query based on the data you
+supply. You can pass an **array** or an **object** to the function. Here
+is an example using an array::
+
+	$data = array(
+		'title' => $title,
+		'name' => $name,
+		'date' => $date
+	);
+	
+	$this->db->where('id', $id);
+	$this->db->update('mytable', $data);
+	// Produces: // UPDATE mytable  // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
+
+Or you can supply an object::
+
+	/*
+	class Myclass {
+		var  $title = 'My Title';
+		var  $content = 'My Content';
+		var  $date = 'My Date';
+	}
+	*/
+	
+	$object = new Myclass;
+	$this->db->where('id', $id);
+	$this->db->update('mytable', $object);
+	// Produces: // UPDATE mytable  // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
+
+.. note:: All values are escaped automatically producing safer queries.
+
+You'll notice the use of the $this->db->where() function, enabling you
+to set the WHERE clause. You can optionally pass this information
+directly into the update function as a string::
+
+	$this->db->update('mytable', $data, "id = 4");
+
+Or as an array::
+
+	$this->db->update('mytable', $data, array('id' => $id));
+
+You may also use the $this->db->set() function described above when
+performing updates.
+
+$this->db->update_batch()
+=========================
+
+Generates an update string based on the data you supply, and runs the query.
+You can either pass an **array** or an **object** to the function.
+Here is an example using an array::
+
+	$data = array(
+	   array(
+	      'title' => 'My title' ,
+	      'name' => 'My Name 2' ,
+	      'date' => 'My date 2'
+	   ),
+	   array(
+	      'title' => 'Another title' ,
+	      'name' => 'Another Name 2' ,
+	      'date' => 'Another date 2'
+	   )
+	);
+
+	$this->db->update_batch('mytable', $data, 'title'); 
+
+	// Produces: 
+	// UPDATE `mytable` SET `name` = CASE
+	// WHEN `title` = 'My title' THEN 'My Name 2'
+	// WHEN `title` = 'Another title' THEN 'Another Name 2'
+	// ELSE `name` END,
+	// `date` = CASE 
+	// WHEN `title` = 'My title' THEN 'My date 2'
+	// WHEN `title` = 'Another title' THEN 'Another date 2'
+	// ELSE `date` END
+	// WHERE `title` IN ('My title','Another title')
+
+The first parameter will contain the table name, the second is an associative
+array of values, the third parameter is the where key.
+
+.. note:: All values are escaped automatically producing safer queries.
+
+
+*************
+Deleting Data
+*************
+
+$this->db->delete()
+===================
+
+Generates a delete SQL string and runs the query.
+
+::
+
+	$this->db->delete('mytable', array('id' => $id));  // Produces: // DELETE FROM mytable  // WHERE id = $id
+
+The first parameter is the table name, the second is the where clause.
+You can also use the where() or or_where() functions instead of passing
+the data to the second parameter of the function::
+
+	$this->db->where('id', $id);
+	$this->db->delete('mytable');
+	
+	// Produces:
+	// DELETE FROM mytable
+	// WHERE id = $id
+
+
+An array of table names can be passed into delete() if you would like to
+delete data from more than 1 table.
+
+::
+
+	$tables = array('table1', 'table2', 'table3');
+	$this->db->where('id', '5');
+	$this->db->delete($tables);
+
+
+If you want to delete all data from a table, you can use the truncate()
+function, or empty_table().
+
+$this->db->empty_table()
+========================
+
+Generates a delete SQL string and runs the
+query.::
+
+	  $this->db->empty_table('mytable'); // Produces // DELETE FROM mytable
+
+
+$this->db->truncate()
+=====================
+
+Generates a truncate SQL string and runs the query.
+
+::
+
+	$this->db->from('mytable');
+	$this->db->truncate();  
+	
+	// or  
+	
+	$this->db->truncate('mytable');
+	
+	// Produce:
+	// TRUNCATE mytable 
+
+.. note:: If the TRUNCATE command isn't available, truncate() will
+	execute as "DELETE FROM table".
+
+***************
+Method Chaining
+***************
+
+Method chaining allows you to simplify your syntax by connecting
+multiple functions. Consider this example::
+
+	$query = $this->db->select('title')
+				->where('id', $id)
+				->limit(10, 20)
+				->get('mytable');
+
+.. note:: Method chaining only works with PHP 5.
+
+.. _ar-caching:
+
+*********************
+Active Record Caching
+*********************
+
+While not "true" caching, Active Record enables you to save (or "cache")
+certain parts of your queries for reuse at a later point in your
+script's execution. Normally, when an Active Record call is completed,
+all stored information is reset for the next call. With caching, you can
+prevent this reset, and reuse information easily.
+
+Cached calls are cumulative. If you make 2 cached select() calls, and
+then 2 uncached select() calls, this will result in 4 select() calls.
+There are three Caching functions available:
+
+$this->db->start_cache()
+========================
+
+This function must be called to begin caching. All Active Record queries
+of the correct type (see below for supported queries) are stored for
+later use.
+
+$this->db->stop_cache()
+=======================
+
+This function can be called to stop caching.
+
+$this->db->flush_cache()
+========================
+
+This function deletes all items from the Active Record cache.
+
+Here's a usage example::
+
+	$this->db->start_cache();
+	$this->db->select('field1');
+	$this->db->stop_cache();
+	$this->db->get('tablename');
+	//Generates: SELECT `field1` FROM (`tablename`)
+	
+	$this->db->select('field2');
+	$this->db->get('tablename');
+	//Generates:  SELECT `field1`, `field2` FROM (`tablename`)
+	
+	$this->db->flush_cache();
+	$this->db->select('field2');
+	$this->db->get('tablename');
+	//Generates:  SELECT `field2` FROM (`tablename`)
+
+
+.. note:: The following statements can be cached: select, from, join,
+	where, like, group_by, having, order_by, set
+
+
diff --git a/user_guide_src/source/database/caching.rst b/user_guide_src/source/database/caching.rst
new file mode 100644
index 0000000..7a195a7
--- /dev/null
+++ b/user_guide_src/source/database/caching.rst
@@ -0,0 +1,152 @@
+######################
+Database Caching Class
+######################
+
+The Database Caching Class permits you to cache your queries as text
+files for reduced database load.
+
+.. important:: This class is initialized automatically by the database
+	driver when caching is enabled. Do NOT load this class manually.
+
+.. important:: Not all query result functions are available when you
+	use caching. Please read this page carefully.
+
+Enabling Caching
+================
+
+Caching is enabled in three steps:
+
+-  Create a writable directory on your server where the cache files can
+   be stored.
+-  Set the path to your cache folder in your
+   application/config/database.php file.
+-  Enable the caching feature, either globally by setting the preference
+   in your application/config/database.php file, or manually as
+   described below.
+
+Once enabled, caching will happen automatically whenever a page is
+loaded that contains database queries.
+
+How Does Caching Work?
+======================
+
+CodeIgniter's query caching system happens dynamically when your pages
+are viewed. When caching is enabled, the first time a web page is
+loaded, the query result object will be serialized and stored in a text
+file on your server. The next time the page is loaded the cache file
+will be used instead of accessing your database. Your database usage can
+effectively be reduced to zero for any pages that have been cached.
+
+Only read-type (SELECT) queries can be cached, since these are the only
+type of queries that produce a result. Write-type (INSERT, UPDATE, etc.)
+queries, since they don't generate a result, will not be cached by the
+system.
+
+Cache files DO NOT expire. Any queries that have been cached will remain
+cached until you delete them. The caching system permits you clear
+caches associated with individual pages, or you can delete the entire
+collection of cache files. Typically you'll want to use the housekeeping
+functions described below to delete cache files after certain events
+take place, like when you've added new information to your database.
+
+Will Caching Improve Your Site's Performance?
+=============================================
+
+Getting a performance gain as a result of caching depends on many
+factors. If you have a highly optimized database under very little load,
+you probably won't see a performance boost. If your database is under
+heavy use you probably will see an improved response, assuming your
+file-system is not overly taxed. Remember that caching simply changes
+how your information is retrieved, shifting it from being a database
+operation to a file-system one.
+
+In some clustered server environments, for example, caching may be
+detrimental since file-system operations are so intense. On single
+servers in shared environments, caching will probably be beneficial.
+Unfortunately there is no single answer to the question of whether you
+should cache your database. It really depends on your situation.
+
+How are Cache Files Stored?
+===========================
+
+CodeIgniter places the result of EACH query into its own cache file.
+Sets of cache files are further organized into sub-folders corresponding
+to your controller functions. To be precise, the sub-folders are named
+identically to the first two segments of your URI (the controller class
+name and function name).
+
+For example, let's say you have a controller called blog with a function
+called comments that contains three queries. The caching system will
+create a cache folder called blog+comments, into which it will write
+three cache files.
+
+If you use dynamic queries that change based on information in your URI
+(when using pagination, for example), each instance of the query will
+produce its own cache file. It's possible, therefore, to end up with
+many times more cache files than you have queries.
+
+Managing your Cache Files
+=========================
+
+Since cache files do not expire, you'll need to build deletion routines
+into your application. For example, let's say you have a blog that
+allows user commenting. Whenever a new comment is submitted you'll want
+to delete the cache files associated with the controller function that
+serves up your comments. You'll find two delete functions described
+below that help you clear data.
+
+Not All Database Functions Work with Caching
+============================================
+
+Lastly, we need to point out that the result object that is cached is a
+simplified version of the full result object. For that reason, some of
+the query result functions are not available for use.
+
+The following functions ARE NOT available when using a cached result
+object:
+
+-  num_fields()
+-  field_names()
+-  field_data()
+-  free_result()
+
+Also, the two database resources (result_id and conn_id) are not
+available when caching, since result resources only pertain to run-time
+operations.
+
+******************
+Function Reference
+******************
+
+$this->db->cache_on() / $this->db->cache_off()
+================================================
+
+Manually enables/disables caching. This can be useful if you want to
+keep certain queries from being cached. Example::
+
+	 // Turn caching on $this->db->cache_on(); $query = $this->db->query("SELECT * FROM mytable");  // Turn caching off for this one query $this->db->cache_off(); $query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");  // Turn caching back on $this->db->cache_on(); $query = $this->db->query("SELECT * FROM another_table");
+
+$this->db->cache_delete()
+==========================
+
+Deletes the cache files associated with a particular page. This is
+useful if you need to clear caching after you update your database.
+
+The caching system saves your cache files to folders that correspond to
+the URI of the page you are viewing. For example, if you are viewing a
+page at example.com/index.php/blog/comments, the caching system will put
+all cache files associated with it in a folder called blog+comments. To
+delete those particular cache files you will use::
+
+	$this->db->cache_delete('blog', 'comments');
+
+If you do not use any parameters the current URI will be used when
+determining what should be cleared.
+
+$this->db->cache_delete_all()
+===============================
+
+Clears all existing cache files. Example::
+
+	$this->db->cache_delete_all();
+
diff --git a/user_guide_src/source/database/call_function.rst b/user_guide_src/source/database/call_function.rst
new file mode 100644
index 0000000..bdc5be0
--- /dev/null
+++ b/user_guide_src/source/database/call_function.rst
@@ -0,0 +1,38 @@
+#####################
+Custom Function Calls
+#####################
+
+$this->db->call_function();
+============================
+
+This function enables you to call PHP database functions that are not
+natively included in CodeIgniter, in a platform independent manner. For
+example, lets say you want to call the mysql_get_client_info()
+function, which is **not** natively supported by CodeIgniter. You could
+do so like this::
+
+	$this->db->call_function('get_client_info');
+
+You must supply the name of the function, **without** the mysql\_
+prefix, in the first parameter. The prefix is added automatically based
+on which database driver is currently being used. This permits you to
+run the same function on different database platforms. Obviously not all
+function calls are identical between platforms, so there are limits to
+how useful this function can be in terms of portability.
+
+Any parameters needed by the function you are calling will be added to
+the second parameter.
+
+::
+
+	$this->db->call_function('some_function', $param1, $param2, etc..);
+
+Often, you will either need to supply a database connection ID or a
+database result ID. The connection ID can be accessed using::
+
+	$this->db->conn_id;
+
+The result ID can be accessed from within your result object, like this::
+
+	$query = $this->db->query("SOME QUERY");  $query->result_id;
+
diff --git a/user_guide_src/source/database/configuration.rst b/user_guide_src/source/database/configuration.rst
new file mode 100644
index 0000000..77b4994
--- /dev/null
+++ b/user_guide_src/source/database/configuration.rst
@@ -0,0 +1,107 @@
+######################
+Database Configuration
+######################
+
+CodeIgniter has a config file that lets you store your database
+connection values (username, password, database name, etc.). The config
+file is located at application/config/database.php. You can also set
+database connection values for specific
+:doc:`environments <../libraries/config>` by placing **database.php**
+it the respective environment config folder.
+
+The config settings are stored in a multi-dimensional array with this
+prototype::
+
+	$db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = ""; $db['default']['database'] = "database_name"; $db['default']['dbdriver'] = "mysql"; $db['default']['dbprefix'] = ""; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = FALSE; $db['default']['cache_on'] = FALSE; $db['default']['cachedir'] =  ""; $db['default']['char_set'] = "utf8"; $db['default']['dbcollat'] = "utf8_general_ci"; $db['default']['swap_pre'] = ""; $db['default']['autoinit'] = TRUE; $db['default']['stricton'] = FALSE;
+
+The reason we use a multi-dimensional array rather than a more simple
+one is to permit you to optionally store multiple sets of connection
+values. If, for example, you run multiple environments (development,
+production, test, etc.) under a single installation, you can set up a
+connection group for each, then switch between groups as needed. For
+example, to set up a "test" environment you would do this::
+
+	$db['test']['hostname'] = "localhost"; $db['test']['username'] = "root"; $db['test']['password'] = ""; $db['test']['database'] = "database_name"; $db['test']['dbdriver'] = "mysql"; $db['test']['dbprefix'] = ""; $db['test']['pconnect'] = TRUE; $db['test']['db_debug'] = FALSE; $db['test']['cache_on'] = FALSE; $db['test']['cachedir'] =  ""; $db['test']['char_set'] = "utf8"; $db['test']['dbcollat'] = "utf8_general_ci"; $db['test']['swap_pre'] = ""; $db['test']['autoinit'] = TRUE; $db['test']['stricton'] = FALSE;
+
+Then, to globally tell the system to use that group you would set this
+variable located in the config file::
+
+	$active_group = "test";
+
+Note: The name "test" is arbitrary. It can be anything you want. By
+default we've used the word "default" for the primary connection, but it
+too can be renamed to something more relevant to your project.
+
+Active Record
+-------------
+
+The :doc:`Active Record Class <active_record>` is globally enabled or
+disabled by setting the $active_record variable in the database
+configuration file to TRUE/FALSE (boolean). If you are not using the
+active record class, setting it to FALSE will utilize fewer resources
+when the database classes are initialized.
+
+::
+
+	$active_record = TRUE;
+
+.. note:: that some CodeIgniter classes such as Sessions require Active
+	Records be enabled to access certain functionality.
+
+Explanation of Values:
+----------------------
+
+-  **hostname** - The hostname of your database server. Often this is
+	"localhost".
+-  **username** - The username used to connect to the database.
+-  **password** - The password used to connect to the database.
+-  **database** - The name of the database you want to connect to.
+-  **dbdriver** - The database type. ie: mysql, postgres, odbc, etc.
+	Must be specified in lower case.
+-  **dbprefix** - An optional table prefix which will added to the table
+	name when running :doc:`Active Record <active_record>` queries. This
+	permits multiple CodeIgniter installations to share one database.
+-  **pconnect** - TRUE/FALSE (boolean) - Whether to use a persistent
+	connection.
+-  **db_debug** - TRUE/FALSE (boolean) - Whether database errors should
+	be displayed.
+-  **cache_on** - TRUE/FALSE (boolean) - Whether database query caching
+	is enabled, see also :doc:`Database Caching Class <caching>`.
+-  **cachedir** - The absolute server path to your database query cache
+	directory.
+-  **char_set** - The character set used in communicating with the
+	database.
+-  **dbcollat** - The character collation used in communicating with the
+	database.
+
+.. note:: For MySQL and MySQLi databases, this setting is only used
+	as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
+	(and in table creation queries made with DB Forge). There is an
+	incompatibility in PHP with mysql_real_escape_string() which can
+	make your site vulnerable to SQL injection if you are using a
+	multi-byte character set and are running versions lower than these.
+	Sites using Latin-1 or UTF-8 database character set and collation are
+	unaffected.
+
+-  **swap_pre** - A default table prefix that should be swapped with
+	dbprefix. This is useful for distributed applications where you might
+	run manually written queries, and need the prefix to still be
+	customizable by the end user.
+-  **autoinit** - Whether or not to automatically connect to the
+	database when the library loads. If set to false, the connection will
+	take place prior to executing the first query.
+-  **stricton** - TRUE/FALSE (boolean) - Whether to force "Strict Mode"
+	connections, good for ensuring strict SQL while developing an
+	application.
+-  **port** - The database port number. To use this value you have to
+	add a line to the database config
+	array.::
+
+	$db['default']['port'] =  5432;
+
+
+.. note:: Depending on what database platform you are using (MySQL,
+	Postgres, etc.) not all values will be needed. For example, when using
+	SQLite you will not need to supply a username or password, and the
+	database name will be the path to your database file. The information
+	above assumes you are using MySQL.
diff --git a/user_guide_src/source/database/connecting.rst b/user_guide_src/source/database/connecting.rst
new file mode 100644
index 0000000..6c54943
--- /dev/null
+++ b/user_guide_src/source/database/connecting.rst
@@ -0,0 +1,131 @@
+###########################
+Connecting to your Database
+###########################
+
+There are two ways to connect to a database:
+
+Automatically Connecting
+========================
+
+The "auto connect" feature will load and instantiate the database class
+with every page load. To enable "auto connecting", add the word database
+to the library array, as indicated in the following file:
+
+application/config/autoload.php
+
+Manually Connecting
+===================
+
+If only some of your pages require database connectivity you can
+manually connect to your database by adding this line of code in any
+function where it is needed, or in your class constructor to make the
+database available globally in that class.
+
+::
+
+	$this->load->database();
+
+If the above function does **not** contain any information in the first
+parameter it will connect to the group specified in your database config
+file. For most people, this is the preferred method of use.
+
+Available Parameters
+--------------------
+
+#. The database connection values, passed either as an array or a DSN
+   string.
+#. TRUE/FALSE (boolean). Whether to return the connection ID (see
+   Connecting to Multiple Databases below).
+#. TRUE/FALSE (boolean). Whether to enable the Active Record class. Set
+   to TRUE by default.
+
+Manually Connecting to a Database
+---------------------------------
+
+The first parameter of this function can **optionally** be used to
+specify a particular database group from your config file, or you can
+even submit connection values for a database that is not specified in
+your config file. Examples:
+
+To choose a specific group from your config file you can do this::
+
+	$this->load->database('group_name');
+
+Where group_name is the name of the connection group from your config
+file.
+
+To connect manually to a desired database you can pass an array of
+values::
+
+	$config['hostname'] = "localhost"; $config['username'] = "myusername"; $config['password'] = "mypassword"; $config['database'] = "mydatabase"; $config['dbdriver'] = "mysql"; $config['dbprefix'] = ""; $config['pconnect'] = FALSE; $config['db_debug'] = TRUE; $config['cache_on'] = FALSE; $config['cachedir'] = ""; $config['char_set'] = "utf8"; $config['dbcollat'] = "utf8_general_ci";  $this->load->database($config);
+
+For information on each of these values please see the :doc:`configuration
+page <configuration>`.
+
+.. note:: For the PDO driver, $config['hostname'] should look like
+	this: 'mysql:host=localhost'
+
+Or you can submit your database values as a Data Source Name. DSNs must
+have this prototype::
+
+	$dsn = 'dbdriver://username:password@hostname/database';  $this->load->database($dsn);
+
+To override default config values when connecting with a DSN string, add
+the config variables as a query string.
+
+::
+
+	$dsn = 'dbdriver://username:password@hostname/database?char_set=utf8&dbcollat=utf8_general_ci&cache_on=true&cachedir=/path/to/cache';  $this->load->database($dsn);
+
+Connecting to Multiple Databases
+================================
+
+If you need to connect to more than one database simultaneously you can
+do so as follows::
+
+	$DB1 = $this->load->database('group_one', TRUE); $DB2 = $this->load->database('group_two', TRUE);
+
+Note: Change the words "group_one" and "group_two" to the specific
+group names you are connecting to (or you can pass the connection values
+as indicated above).
+
+By setting the second parameter to TRUE (boolean) the function will
+return the database object.
+
+When you connect this way, you will use your object name to issue
+commands rather than the syntax used throughout this guide. In other
+words, rather than issuing commands with:
+
+$this->db->query();
+$this->db->result();
+etc...
+
+You will instead use:
+
+$DB1->query();
+$DB1->result();
+etc...
+
+Reconnecting / Keeping the Connection Alive
+===========================================
+
+If the database server's idle timeout is exceeded while you're doing
+some heavy PHP lifting (processing an image, for instance), you should
+consider pinging the server by using the reconnect() method before
+sending further queries, which can gracefully keep the connection alive
+or re-establish it.
+
+::
+
+	$this->db->reconnect();
+
+Manually closing the Connection
+===============================
+
+While CodeIgniter intelligently takes care of closing your database
+connections, you can explicitly close the connection.
+
+::
+
+	$this->db->close();
+
diff --git a/user_guide_src/source/database/examples.rst b/user_guide_src/source/database/examples.rst
new file mode 100644
index 0000000..bd2cc4d
--- /dev/null
+++ b/user_guide_src/source/database/examples.rst
@@ -0,0 +1,94 @@
+##################################
+Database Quick Start: Example Code
+##################################
+
+The following page contains example code showing how the database class
+is used. For complete details please read the individual pages
+describing each function.
+
+Initializing the Database Class
+===============================
+
+The following code loads and initializes the database class based on
+your :doc:`configuration <configuration>` settings::
+
+	$this->load->database();
+
+Once loaded the class is ready to be used as described below.
+
+Note: If all your pages require database access you can connect
+automatically. See the :doc:`connecting <connecting>` page for details.
+
+Standard Query With Multiple Results (Object Version)
+=====================================================
+
+::
+
+	$query = $this->db->query('SELECT name, title, email FROM my_table');  foreach ($query->result() as $row) {     echo $row->title;     echo $row->name;     echo $row->email; }  echo 'Total Results: ' . $query->num_rows();
+
+The above result() function returns an array of **objects**. Example:
+$row->title
+
+Standard Query With Multiple Results (Array Version)
+====================================================
+
+::
+
+	$query = $this->db->query('SELECT name, title, email FROM my_table');  foreach ($query->result_array() as $row) {     echo $row['title'];     echo $row['name'];     echo $row['email']; }
+
+The above result_array() function returns an array of standard array
+indexes. Example: $row['title']
+
+Testing for Results
+===================
+
+If you run queries that might **not** produce a result, you are
+encouraged to test for a result first using the num_rows() function::
+
+	 $query = $this->db->query("YOUR QUERY");  if ($query->num_rows() > 0) {    foreach ($query->result() as $row)    {       echo $row->title;       echo $row->name;       echo $row->body;    } }
+
+Standard Query With Single Result
+=================================
+
+::
+
+	$query = $this->db->query('SELECT name FROM my_table LIMIT 1');  $row = $query->row(); echo $row->name;
+
+The above row() function returns an **object**. Example: $row->name
+
+Standard Query With Single Result (Array version)
+=================================================
+
+::
+
+	$query = $this->db->query('SELECT name FROM my_table LIMIT 1');  $row = $query->row_array(); echo $row['name'];
+
+The above row_array() function returns an **array**. Example:
+$row['name']
+
+Standard Insert
+===============
+
+::
+
+	 $sql = "INSERT INTO mytable (title, name)          VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")";  $this->db->query($sql);  echo $this->db->affected_rows();
+
+Active Record Query
+===================
+
+The :doc:`Active Record Pattern <active_record>` gives you a simplified
+means of retrieving data::
+
+	 $query = $this->db->get('table_name');  foreach ($query->result() as $row) {     echo $row->title; }
+
+The above get() function retrieves all the results from the supplied
+table. The :doc:`Active Record <active_record>` class contains a full
+compliment of functions for working with data.
+
+Active Record Insert
+====================
+
+::
+
+	 $data = array(                'title' => $title,                'name' => $name,                'date' => $date             );  $this->db->insert('mytable', $data);  // Produces: INSERT INTO mytable (title, name, date) VALUES ('{$title}', '{$name}', '{$date}')
+
diff --git a/user_guide_src/source/database/fields.rst b/user_guide_src/source/database/fields.rst
new file mode 100644
index 0000000..07730f5
--- /dev/null
+++ b/user_guide_src/source/database/fields.rst
@@ -0,0 +1,59 @@
+##########
+Field Data
+##########
+
+$this->db->list_fields()
+=========================
+
+Returns an array containing the field names. This query can be called
+two ways:
+
+1. You can supply the table name and call it from the $this->db->
+object::
+
+	 $fields = $this->db->list_fields('table_name');  foreach ($fields as $field) {    echo $field; }
+
+2. You can gather the field names associated with any query you run by
+calling the function from your query result object::
+
+	 $query = $this->db->query('SELECT * FROM some_table');   foreach ($query->list_fields() as $field) {    echo $field; }
+
+$this->db->field_exists()
+==========================
+
+Sometimes it's helpful to know whether a particular field exists before
+performing an action. Returns a boolean TRUE/FALSE. Usage example::
+
+	 if ($this->db->field_exists('field_name', 'table_name')) {    // some code... }
+
+Note: Replace *field_name* with the name of the column you are looking
+for, and replace *table_name* with the name of the table you are
+looking for.
+
+$this->db->field_data()
+========================
+
+Returns an array of objects containing field information.
+
+Sometimes it's helpful to gather the field names or other metadata, like
+the column type, max length, etc.
+
+Note: Not all databases provide meta-data.
+
+Usage example::
+
+	 $fields = $this->db->field_data('table_name');  foreach ($fields as $field) {    echo $field->name;    echo $field->type;    echo $field->max_length;    echo $field->primary_key; }
+
+If you have run a query already you can use the result object instead of
+supplying the table name::
+
+	 $query = $this->db->query("YOUR QUERY"); $fields = $query->field_data();
+
+The following data is available from this function if supported by your
+database:
+
+-  name - column name
+-  max_length - maximum length of the column
+-  primary_key - 1 if the column is a primary key
+-  type - the type of the column
+
diff --git a/user_guide_src/source/database/forge.rst b/user_guide_src/source/database/forge.rst
new file mode 100644
index 0000000..ee03324
--- /dev/null
+++ b/user_guide_src/source/database/forge.rst
@@ -0,0 +1,212 @@
+####################
+Database Forge Class
+####################
+
+The Database Forge Class contains functions that help you manage your
+database.
+
+.. contents:: Table of Contents
+
+****************************
+Initializing the Forge Class
+****************************
+
+.. important:: In order to initialize the Forge class, your database
+	driver must already be running, since the forge class relies on it.
+
+Load the Forge Class as follows::
+
+	$this->load->dbforge()
+
+Once initialized you will access the functions using the $this->dbforge
+object::
+
+	$this->dbforge->some_function()
+
+$this->dbforge->create_database('db_name')
+============================================
+
+Permits you to create the database specified in the first parameter.
+Returns TRUE/FALSE based on success or failure::
+
+	if ($this->dbforge->create_database('my_db')) {     echo 'Database created!'; }
+
+$this->dbforge->drop_database('db_name')
+==========================================
+
+Permits you to drop the database specified in the first parameter.
+Returns TRUE/FALSE based on success or failure::
+
+	if ($this->dbforge->drop_database('my_db')) {     echo 'Database deleted!'; }
+
+****************************
+Creating and Dropping Tables
+****************************
+
+There are several things you may wish to do when creating tables. Add
+fields, add keys to the table, alter columns. CodeIgniter provides a
+mechanism for this.
+
+Adding fields
+=============
+
+Fields are created via an associative array. Within the array you must
+include a 'type' key that relates to the datatype of the field. For
+example, INT, VARCHAR, TEXT, etc. Many datatypes (for example VARCHAR)
+also require a 'constraint' key.
+
+::
+
+	$fields = array(                         'users' => array(                                                      'type' => 'VARCHAR',                                                      'constraint' => '100',                                               ),                     );      // will translate to "users VARCHAR(100)" when the field is added.
+
+
+Additionally, the following key/values can be used:
+
+-  unsigned/true : to generate "UNSIGNED" in the field definition.
+-  default/value : to generate a default value in the field definition.
+-  null/true : to generate "NULL" in the field definition. Without this,
+   the field will default to "NOT NULL".
+-  auto_increment/true : generates an auto_increment flag on the
+   field. Note that the field type must be a type that supports this,
+   such as integer.
+
+::
+
+	$fields = array(                             'blog_id' => array(                                                      'type' => 'INT',                                                      'constraint' => 5,                                                       'unsigned' => TRUE,                                                      'auto_increment' => TRUE                                               ),                             'blog_title' => array(                                                  'type' => 'VARCHAR',                                                  'constraint' => '100',                                           ),                         'blog_author' => array(                                                  'type' =>'VARCHAR',                                                  'constraint' => '100',                                                  'default' => 'King of Town',                                           ),                         'blog_description' => array(                                                  'type' => 'TEXT',                                                  'null' => TRUE,                                           ),                 );
+
+
+After the fields have been defined, they can be added using
+$this->dbforge->add_field($fields); followed by a call to the
+create_table() function.
+
+$this->dbforge->add_field()
+----------------------------
+
+The add fields function will accept the above array.
+
+Passing strings as fields
+-------------------------
+
+If you know exactly how you want a field to be created, you can pass the
+string into the field definitions with add_field()
+
+::
+
+	$this->dbforge->add_field("label varchar(100) NOT NULL DEFAULT 'default label'");
+
+
+Note: Multiple calls to add_field() are cumulative.
+
+Creating an id field
+--------------------
+
+There is a special exception for creating id fields. A field with type
+id will automatically be assinged as an INT(9) auto_incrementing
+Primary Key.
+
+::
+
+	$this->dbforge->add_field('id');     // gives id INT(9) NOT NULL AUTO_INCREMENT
+
+
+Adding Keys
+===========
+
+Generally speaking, you'll want your table to have Keys. This is
+accomplished with $this->dbforge->add_key('field'). An optional second
+parameter set to TRUE will make it a primary key. Note that add_key()
+must be followed by a call to create_table().
+
+Multiple column non-primary keys must be sent as an array. Sample output
+below is for MySQL.
+
+::
+
+	$this->dbforge->add_key('blog_id', TRUE);     // gives PRIMARY KEY `blog_id` (`blog_id`)          $this->dbforge->add_key('blog_id', TRUE);     $this->dbforge->add_key('site_id', TRUE);     // gives PRIMARY KEY `blog_id_site_id` (`blog_id`, `site_id`)          $this->dbforge->add_key('blog_name');     // gives KEY `blog_name` (`blog_name`)          $this->dbforge->add_key(array('blog_name', 'blog_label'));     // gives KEY `blog_name_blog_label` (`blog_name`, `blog_label`)
+
+
+Creating a table
+================
+
+After fields and keys have been declared, you can create a new table
+with
+
+::
+
+	$this->dbforge->create_table('table_name'); // gives CREATE TABLE table_name
+
+
+An optional second parameter set to TRUE adds an "IF NOT EXISTS" clause
+into the definition
+
+::
+
+	$this->dbforge->create_table('table_name', TRUE); // gives CREATE TABLE IF NOT EXISTS table_name
+
+
+Dropping a table
+================
+
+Executes a DROP TABLE sql
+
+::
+
+	$this->dbforge->drop_table('table_name');     // gives DROP TABLE IF EXISTS  table_name
+
+
+Renaming a table
+================
+
+Executes a TABLE rename
+
+::
+
+	$this->dbforge->rename_table('old_table_name', 'new_table_name');     // gives ALTER TABLE old_table_name RENAME TO new_table_name
+
+
+****************
+Modifying Tables
+****************
+
+$this->dbforge->add_column()
+=============================
+
+The add_column() function is used to modify an existing table. It
+accepts the same field array as above, and can be used for an unlimited
+number of additional fields.
+
+::
+
+	$fields = array(                             'preferences' => array('type' => 'TEXT') ); $this->dbforge->add_column('table_name', $fields);  // gives ALTER TABLE table_name ADD     preferences TEXT
+
+An optional third parameter can be used to specify which existing column
+to add the new column after.
+
+::
+
+	$this->dbforge->add_column('table_name', $fields, 'after_field');
+
+
+$this->dbforge->drop_column()
+==============================
+
+Used to remove a column from a table.
+
+::
+
+	$this->dbforge->drop_column('table_name', 'column_to_drop');
+
+
+$this->dbforge->modify_column()
+================================
+
+The usage of this function is identical to add_column(), except it
+alters an existing column rather than adding a new one. In order to
+change the name you can add a "name" key into the field defining array.
+
+::
+
+	$fields = array(                         'old_name' => array(                                                          'name' => 'new_name',                                                          'type' => 'TEXT',                                                 ), ); $this->dbforge->modify_column('table_name', $fields);          // gives ALTER TABLE table_name CHANGE      old_name new_name TEXT 
+
+
+
diff --git a/user_guide_src/source/database/helpers.rst b/user_guide_src/source/database/helpers.rst
new file mode 100644
index 0000000..b0a5ce9
--- /dev/null
+++ b/user_guide_src/source/database/helpers.rst
@@ -0,0 +1,88 @@
+######################
+Query Helper Functions
+######################
+
+$this->db->insert_id()
+=======================
+
+The insert ID number when performing database inserts.
+
+.. note:: If using the PDO driver with PostgreSQL, this function requires
+	a $name parameter, which specifies the appropriate sequence to check
+	for the insert id.
+
+$this->db->affected_rows()
+===========================
+
+Displays the number of affected rows, when doing "write" type queries
+(insert, update, etc.).
+
+.. note:: In MySQL "DELETE FROM TABLE" returns 0 affected rows. The database
+	class has a small hack that allows it to return the correct number of
+	affected rows. By default this hack is enabled but it can be turned off
+	in the database driver file.
+
+$this->db->count_all();
+========================
+
+Permits you to determine the number of rows in a particular table.
+Submit the table name in the first parameter. Example::
+
+	echo $this->db->count_all('my_table');  // Produces an integer, like 25
+
+$this->db->platform()
+=====================
+
+Outputs the database platform you are running (MySQL, MS SQL, Postgres,
+etc...)::
+
+	echo $this->db->platform();
+
+$this->db->version()
+====================
+
+Outputs the database version you are running::
+
+	echo $this->db->version();
+
+$this->db->last_query();
+=========================
+
+Returns the last query that was run (the query string, not the result).
+Example::
+
+	$str = $this->db->last_query();  // Produces:  SELECT * FROM sometable....
+
+The following two functions help simplify the process of writing
+database INSERTs and UPDATEs.
+
+$this->db->insert_string();
+============================
+
+This function simplifies the process of writing database inserts. It
+returns a correctly formatted SQL insert string. Example::
+
+	$data = array('name' => $name, 'email' => $email, 'url' => $url);  $str = $this->db->insert_string('table_name', $data);
+
+The first parameter is the table name, the second is an associative
+array with the data to be inserted. The above example produces::
+
+	INSERT INTO table_name (name, email, url) VALUES ('Rick', 'rick@example.com', 'example.com')
+
+Note: Values are automatically escaped, producing safer queries.
+
+$this->db->update_string();
+============================
+
+This function simplifies the process of writing database updates. It
+returns a correctly formatted SQL update string. Example::
+
+	$data = array('name' => $name, 'email' => $email, 'url' => $url);  $where = "author_id = 1 AND status = 'active'";  $str = $this->db->update_string('table_name', $data, $where);
+
+The first parameter is the table name, the second is an associative
+array with the data to be updated, and the third parameter is the
+"where" clause. The above example produces::
+
+	 UPDATE table_name SET name = 'Rick', email = 'rick@example.com', url = 'example.com' WHERE author_id = 1 AND status = 'active'
+
+Note: Values are automatically escaped, producing safer queries.
diff --git a/user_guide_src/source/database/index.rst b/user_guide_src/source/database/index.rst
new file mode 100644
index 0000000..3b59986
--- /dev/null
+++ b/user_guide_src/source/database/index.rst
@@ -0,0 +1,29 @@
+##################
+The Database Class
+##################
+
+CodeIgniter comes with a full-featured and very fast abstracted database
+class that supports both traditional structures and Active Record
+patterns. The database functions offer clear, simple syntax.
+
+-  :doc:`Quick Start: Usage Examples <examples>`
+-  :doc:`Database Configuration <configuration>`
+-  :doc:`Connecting to a Database <connecting>`
+-  :doc:`Running Queries <queries>`
+-  :doc:`Generating Query Results <results>`
+-  :doc:`Query Helper Functions <helpers>`
+-  :doc:`Active Record Class <active_record>`
+-  :doc:`Transactions <transactions>`
+-  :doc:`Table MetaData <table_data>`
+-  :doc:`Field MetaData <fields>`
+-  :doc:`Custom Function Calls <call_function>`
+-  :doc:`Query Caching <caching>`
+-  :doc:`Database manipulation with Database Forge <forge>`
+-  :doc:`Database Utilities Class <utilities>`
+
+.. toctree::
+	:glob:
+	:titlesonly:
+	:hidden:
+	
+	*
\ No newline at end of file
diff --git a/user_guide_src/source/database/queries.rst b/user_guide_src/source/database/queries.rst
new file mode 100644
index 0000000..cfc42c4
--- /dev/null
+++ b/user_guide_src/source/database/queries.rst
@@ -0,0 +1,112 @@
+#######
+Queries
+#######
+
+$this->db->query();
+===================
+
+To submit a query, use the following function::
+
+	$this->db->query('YOUR QUERY HERE');
+
+The query() function returns a database result **object** when "read"
+type queries are run, which you can use to :doc:`show your
+results <results>`. When "write" type queries are run it simply
+returns TRUE or FALSE depending on success or failure. When retrieving
+data you will typically assign the query to your own variable, like
+this::
+
+	$query = $this->db->query('YOUR QUERY HERE');
+
+$this->db->simple_query();
+===========================
+
+This is a simplified version of the $this->db->query() function. It ONLY
+returns TRUE/FALSE on success or failure. It DOES NOT return a database
+result set, nor does it set the query timer, or compile bind data, or
+store your query for debugging. It simply lets you submit a query. Most
+users will rarely use this function.
+
+***************************************
+Working with Database prefixes manually
+***************************************
+
+If you have configured a database prefix and would like to prepend it to
+a table name for use in a native SQL query for example, then you can use
+the following::
+
+	$this->db->dbprefix('tablename'); // outputs prefix_tablename
+
+
+If for any reason you would like to change the prefix programatically
+without needing to create a new connection, you can use this method::
+
+	$this->db->set_dbprefix('newprefix'); $this->db->dbprefix('tablename'); // outputs newprefix_tablename
+
+
+**********************
+Protecting identifiers
+**********************
+
+In many databases it is advisable to protect table and field names - for
+example with backticks in MySQL. **Active Record queries are
+automatically protected**, however if you need to manually protect an
+identifier you can use::
+
+	$this->db->protect_identifiers('table_name');
+
+
+This function will also add a table prefix to your table, assuming you
+have a prefix specified in your database config file. To enable the
+prefixing set TRUE (boolen) via the second parameter::
+
+	$this->db->protect_identifiers('table_name', TRUE);
+
+
+****************
+Escaping Queries
+****************
+
+It's a very good security practice to escape your data before submitting
+it into your database. CodeIgniter has three methods that help you do
+this:
+
+#. **$this->db->escape()** This function determines the data type so
+   that it can escape only string data. It also automatically adds
+   single quotes around the data so you don't have to:
+   ::
+
+	$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
+
+#. **$this->db->escape_str()** This function escapes the data passed to
+   it, regardless of type. Most of the time you'll use the above
+   function rather than this one. Use the function like this:
+   ::
+
+	$sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
+
+#. **$this->db->escape_like_str()** This method should be used when
+   strings are to be used in LIKE conditions so that LIKE wildcards
+   ('%', '\_') in the string are also properly escaped.
+
+::
+
+	$search = '20% raise'; $sql = "SELECT id FROM table WHERE column LIKE '%".$this->db->escape_like_str($search)."%'";
+
+
+**************
+Query Bindings
+**************
+
+Bindings enable you to simplify your query syntax by letting the system
+put the queries together for you. Consider the following example::
+
+	 $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";  $this->db->query($sql, array(3, 'live', 'Rick'));
+
+The question marks in the query are automatically replaced with the
+values in the array in the second parameter of the query function.
+
+The secondary benefit of using binds is that the values are
+automatically escaped, producing safer queries. You don't have to
+remember to manually escape data; the engine does it automatically for
+you.
diff --git a/user_guide_src/source/database/results.rst b/user_guide_src/source/database/results.rst
new file mode 100644
index 0000000..a85b89b
--- /dev/null
+++ b/user_guide_src/source/database/results.rst
@@ -0,0 +1,124 @@
+########################
+Generating Query Results
+########################
+
+There are several ways to generate query results:
+
+result()
+========
+
+This function returns the query result as an array of **objects**, or
+**an empty array** on failure. Typically you'll use this in a foreach
+loop, like this::
+
+	     $query = $this->db->query("YOUR QUERY");          foreach ($query->result() as $row)     {        echo $row->title;        echo $row->name;        echo $row->body;     }
+
+The above function is an alias of result_object().
+
+If you run queries that might **not** produce a result, you are
+encouraged to test the result first::
+
+	     $query = $this->db->query("YOUR QUERY");          if ($query->num_rows() > 0)     {        foreach ($query->result() as $row)        {           echo $row->title;           echo $row->name;           echo $row->body;        }     }     
+
+You can also pass a string to result() which represents a class to
+instantiate for each result object (note: this class must be loaded)
+
+::
+
+	$query = $this->db->query("SELECT * FROM users;");
+
+	foreach ($query->result('User') as $user)
+	{
+	   echo $user->name; // call attributes
+	   echo $user->reverse_name(); // or methods defined on the 'User' class
+	}
+
+result_array()
+===============
+
+This function returns the query result as a pure array, or an empty
+array when no result is produced. Typically you'll use this in a foreach
+loop, like this::
+
+	     $query = $this->db->query("YOUR QUERY");          foreach ($query->result_array() as $row)     {        echo $row['title'];        echo $row['name'];        echo $row['body'];     }
+
+row()
+=====
+
+This function returns a single result row. If your query has more than
+one row, it returns only the first row. The result is returned as an
+**object**. Here's a usage example::
+
+	     $query = $this->db->query("YOUR QUERY");          if ($query->num_rows() > 0)     {        $row = $query->row();             echo $row->title;        echo $row->name;        echo $row->body;     }     
+
+If you want a specific row returned you can submit the row number as a
+digit in the first parameter::
+
+	$row = $query->row(5);
+
+You can also add a second String parameter, which is the name of a class
+to instantiate the row with::
+
+	     $query = $this->db->query("SELECT * FROM users LIMIT 1;");          $query->row(0, 'User')     echo $row->name; // call attributes     echo $row->reverse_name(); // or methods defined on the 'User' class     
+
+row_array()
+============
+
+Identical to the above row() function, except it returns an array.
+Example::
+
+	     $query = $this->db->query("YOUR QUERY");          if ($query->num_rows() > 0)     {        $row = $query->row_array();             echo $row['title'];        echo $row['name'];        echo $row['body'];     }     
+
+If you want a specific row returned you can submit the row number as a
+digit in the first parameter::
+
+	$row = $query->row_array(5);
+
+In addition, you can walk forward/backwards/first/last through your
+results using these variations:
+
+**$row = $query->first_row()**
+ **$row = $query->last_row()**
+ **$row = $query->next_row()**
+ **$row = $query->previous_row()**
+
+By default they return an object unless you put the word "array" in the
+parameter:
+
+**$row = $query->first_row('array')**
+ **$row = $query->last_row('array')**
+ **$row = $query->next_row('array')**
+ **$row = $query->previous_row('array')**
+
+***********************
+Result Helper Functions
+***********************
+
+$query->num_rows()
+===================
+
+The number of rows returned by the query. Note: In this example, $query
+is the variable that the query result object is assigned to::
+
+	$query = $this->db->query('SELECT * FROM my_table'); echo $query->num_rows();
+
+$query->num_fields()
+=====================
+
+The number of FIELDS (columns) returned by the query. Make sure to call
+the function using your query result object::
+
+	$query = $this->db->query('SELECT * FROM my_table'); echo $query->num_fields();
+
+$query->free_result()
+======================
+
+It frees the memory associated with the result and deletes the result
+resource ID. Normally PHP frees its memory automatically at the end of
+script execution. However, if you are running a lot of queries in a
+particular script you might want to free the result after each query
+result has been generated in order to cut down on memory consumptions.
+Example::
+
+	$query = $this->db->query('SELECT title FROM my_table'); foreach ($query->result() as $row) {    echo $row->title; } $query->free_result();  // The $query result object will no longer be available  $query2 = $this->db->query('SELECT name FROM some_table'); $row = $query2->row(); echo $row->name; $query2->free_result();  // The $query2 result object will no longer be available
+
diff --git a/user_guide_src/source/database/table_data.rst b/user_guide_src/source/database/table_data.rst
new file mode 100644
index 0000000..ec7dbbf
--- /dev/null
+++ b/user_guide_src/source/database/table_data.rst
@@ -0,0 +1,24 @@
+##########
+Table Data
+##########
+
+These functions let you fetch table information.
+
+$this->db->list_tables();
+==========================
+
+Returns an array containing the names of all the tables in the database
+you are currently connected to. Example::
+
+	$tables = $this->db->list_tables();  foreach ($tables as $table) {    echo $table; }
+
+$this->db->table_exists();
+===========================
+
+Sometimes it's helpful to know whether a particular table exists before
+running an operation on it. Returns a boolean TRUE/FALSE. Usage example::
+
+	 if ($this->db->table_exists('table_name')) {    // some code... }
+
+Note: Replace *table_name* with the name of the table you are looking
+for.
diff --git a/user_guide_src/source/database/transactions.rst b/user_guide_src/source/database/transactions.rst
new file mode 100644
index 0000000..e82210b
--- /dev/null
+++ b/user_guide_src/source/database/transactions.rst
@@ -0,0 +1,96 @@
+############
+Transactions
+############
+
+CodeIgniter's database abstraction allows you to use transactions with
+databases that support transaction-safe table types. In MySQL, you'll
+need to be running InnoDB or BDB table types rather than the more common
+MyISAM. Most other database platforms support transactions natively.
+
+If you are not familiar with transactions we recommend you find a good
+online resource to learn about them for your particular database. The
+information below assumes you have a basic understanding of
+transactions.
+
+CodeIgniter's Approach to Transactions
+======================================
+
+CodeIgniter utilizes an approach to transactions that is very similar to
+the process used by the popular database class ADODB. We've chosen that
+approach because it greatly simplifies the process of running
+transactions. In most cases all that is required are two lines of code.
+
+Traditionally, transactions have required a fair amount of work to
+implement since they demand that you to keep track of your queries and
+determine whether to commit or rollback based on the success or failure
+of your queries. This is particularly cumbersome with nested queries. In
+contrast, we've implemented a smart transaction system that does all
+this for you automatically (you can also manage your transactions
+manually if you choose to, but there's really no benefit).
+
+Running Transactions
+====================
+
+To run your queries using transactions you will use the
+$this->db->trans_start() and $this->db->trans_complete() functions as
+follows::
+
+	 $this->db->trans_start(); $this->db->query('AN SQL QUERY...'); $this->db->query('ANOTHER QUERY...'); $this->db->query('AND YET ANOTHER QUERY...'); $this->db->trans_complete();
+
+You can run as many queries as you want between the start/complete
+functions and they will all be committed or rolled back based on success
+or failure of any given query.
+
+Strict Mode
+===========
+
+By default CodeIgniter runs all transactions in Strict Mode. When strict
+mode is enabled, if you are running multiple groups of transactions, if
+one group fails all groups will be rolled back. If strict mode is
+disabled, each group is treated independently, meaning a failure of one
+group will not affect any others.
+
+Strict Mode can be disabled as follows::
+
+	$this->db->trans_strict(FALSE);
+
+Managing Errors
+===============
+
+If you have error reporting enabled in your config/database.php file
+you'll see a standard error message if the commit was unsuccessful. If
+debugging is turned off, you can manage your own errors like this::
+
+	 $this->db->trans_start(); $this->db->query('AN SQL QUERY...'); $this->db->query('ANOTHER QUERY...'); $this->db->trans_complete();  if ($this->db->trans_status() === FALSE) {     // generate an error... or use the log_message() function to log your error }
+
+Enabling Transactions
+=====================
+
+Transactions are enabled automatically the moment you use
+$this->db->trans_start(). If you would like to disable transactions you
+can do so using $this->db->trans_off()::
+
+	 $this->db->trans_off()  $this->db->trans_start(); $this->db->query('AN SQL QUERY...'); $this->db->trans_complete();
+
+When transactions are disabled, your queries will be auto-commited, just
+as they are when running queries without transactions.
+
+Test Mode
+=========
+
+You can optionally put the transaction system into "test mode", which
+will cause your queries to be rolled back -- even if the queries produce
+a valid result. To use test mode simply set the first parameter in the
+$this->db->trans_start() function to TRUE::
+
+	 $this->db->trans_start(TRUE); // Query will be rolled back $this->db->query('AN SQL QUERY...'); $this->db->trans_complete();
+
+Running Transactions Manually
+=============================
+
+If you would like to run transactions manually you can do so as follows::
+
+	 $this->db->trans_begin();  $this->db->query('AN SQL QUERY...'); $this->db->query('ANOTHER QUERY...'); $this->db->query('AND YET ANOTHER QUERY...');    if ($this->db->trans_status() === FALSE) {     $this->db->trans_rollback(); } else {     $this->db->trans_commit(); }
+
+.. note:: Make sure to use $this->db->trans_begin() when running manual
+	transactions, **NOT** $this->db->trans_start().
diff --git a/user_guide_src/source/database/utilities.rst b/user_guide_src/source/database/utilities.rst
new file mode 100644
index 0000000..7dcf1df
--- /dev/null
+++ b/user_guide_src/source/database/utilities.rst
@@ -0,0 +1,189 @@
+######################
+Database Utility Class
+######################
+
+The Database Utility Class contains functions that help you manage your
+database.
+
+.. contents:: Table of Contents
+
+
+******************
+Function Reference
+******************
+
+Initializing the Utility Class
+==============================
+
+.. important:: In order to initialize the Utility class, your database
+	driver must already be running, since the utilities class relies on it.
+
+Load the Utility Class as follows::
+
+	$this->load->dbutil()
+
+Once initialized you will access the functions using the $this->dbutil
+object::
+
+	$this->dbutil->some_function()
+
+$this->dbutil->list_databases()
+================================
+
+Returns an array of database names::
+
+	 $dbs = $this->dbutil->list_databases();  foreach ($dbs as $db) {     echo $db; }
+
+$this->dbutil->database_exists();
+==================================
+
+Sometimes it's helpful to know whether a particular database exists.
+Returns a boolean TRUE/FALSE. Usage example::
+
+	 if ($this->dbutil->database_exists('database_name')) {    // some code... }
+
+Note: Replace *database_name* with the name of the table you are
+looking for. This function is case sensitive.
+
+$this->dbutil->optimize_table('table_name');
+==============================================
+
+.. note:: This features is only available for MySQL/MySQLi databases.
+
+Permits you to optimize a table using the table name specified in the
+first parameter. Returns TRUE/FALSE based on success or failure::
+
+	 if ($this->dbutil->optimize_table('table_name')) {     echo 'Success!'; }
+
+.. note:: Not all database platforms support table optimization.
+
+$this->dbutil->repair_table('table_name');
+============================================
+
+.. note:: This features is only available for MySQL/MySQLi databases.
+
+Permits you to repair a table using the table name specified in the
+first parameter. Returns TRUE/FALSE based on success or failure::
+
+	 if ($this->dbutil->repair_table('table_name')) {     echo 'Success!'; }
+
+.. note:: Not all database platforms support table repairs.
+
+$this->dbutil->optimize_database();
+====================================
+
+.. note:: This features is only available for MySQL/MySQLi databases.
+
+Permits you to optimize the database your DB class is currently
+connected to. Returns an array containing the DB status messages or
+FALSE on failure.
+
+::
+
+	 $result = $this->dbutil->optimize_database();  if ($result !== FALSE) {     print_r($result); }
+
+.. note:: Not all database platforms support table optimization.
+
+$this->dbutil->csv_from_result($db_result)
+=============================================
+
+Permits you to generate a CSV file from a query result. The first
+parameter of the function must contain the result object from your
+query. Example::
+
+	 $this->load->dbutil();  $query = $this->db->query("SELECT * FROM mytable");  echo $this->dbutil->csv_from_result($query);
+
+The second, third, and fourth parameters allow you to set the delimiter
+newline, and enclosure characters respectively. By default tabs are
+used as the delimiter, "\n" is used as a new line, and a double-quote
+is used as the enclosure. Example::
+
+	$delimiter = ",";
+	$newline = "\r\n";
+	$enclosure = '"';
+
+	echo $this->dbutil->csv_from_result($query, $delimiter, $newline, $enclosure);
+
+.. important:: This function will NOT write the CSV file for you. It
+	simply creates the CSV layout. If you need to write the file
+	use the :doc:`File Helper <../helpers/file_helper>`.
+
+$this->dbutil->xml_from_result($db_result)
+=============================================
+
+Permits you to generate an XML file from a query result. The first
+parameter expects a query result object, the second may contain an
+optional array of config parameters. Example::
+
+	 $this->load->dbutil();  $query = $this->db->query("SELECT * FROM mytable");  $config = array (                   'root'    => 'root',                   'element' => 'element',                    'newline' => "\n",                    'tab'    => "\t"                 );  echo $this->dbutil->xml_from_result($query, $config);
+
+.. important:: This function will NOT write the XML file for you. It
+	simply creates the XML layout. If you need to write the file
+	use the :doc:`File Helper <../helpers/file_helper>`.
+
+$this->dbutil->backup()
+=======================
+
+Permits you to backup your full database or individual tables. The
+backup data can be compressed in either Zip or Gzip format.
+
+.. note:: This features is only available for MySQL databases.
+
+.. note:: Due to the limited execution time and memory available to PHP,
+	backing up very large databases may not be possible. If your database is
+	very large you might need to backup directly from your SQL server via
+	the command line, or have your server admin do it for you if you do not
+	have root privileges.
+
+Usage Example
+-------------
+
+::
+
+	 // Load the DB utility class $this->load->dbutil();  // Backup your entire database and assign it to a variable $backup =& $this->dbutil->backup();   // Load the file helper and write the file to your server $this->load->helper('file'); write_file('/path/to/mybackup.gz', $backup);   // Load the download helper and send the file to your desktop $this->load->helper('download'); force_download('mybackup.gz', $backup);
+
+Setting Backup Preferences
+--------------------------
+
+Backup preferences are set by submitting an array of values to the first
+parameter of the backup function. Example::
+
+	$prefs = array(                 'tables'      => array('table1', 'table2'),  // Array of tables to backup.                 'ignore'      => array(),           // List of tables to omit from the backup                 'format'      => 'txt',             // gzip, zip, txt                 'filename'    => 'mybackup.sql',    // File name - NEEDED ONLY WITH ZIP FILES                 'add_drop'    => TRUE,              // Whether to add DROP TABLE statements to backup file                 'add_insert'  => TRUE,              // Whether to add INSERT data to backup file                 'newline'     => "\n"               // Newline character used in backup file               );  $this->dbutil->backup($prefs);
+
+Description of Backup Preferences
+---------------------------------
+
+Preference
+Default Value
+Options
+Description
+**tables**
+empty array
+None
+An array of tables you want backed up. If left blank all tables will be
+exported.
+**ignore**
+empty array
+None
+An array of tables you want the backup routine to ignore.
+**format**
+gzip
+gzip, zip, txt
+The file format of the export file.
+**filename**
+the current date/time
+None
+The name of the backed-up file. The name is needed only if you are using
+zip compression.
+**add_drop**
+TRUE
+TRUE/FALSE
+Whether to include DROP TABLE statements in your SQL export file.
+**add_insert**
+TRUE
+TRUE/FALSE
+Whether to include INSERT statements in your SQL export file.
+**newline**
+"\\n"
+"\\n", "\\r", "\\r\\n"
+Type of newline to use in your SQL export file.
diff --git a/user_guide_src/source/documentation/ELDocs.tmbundle.zip b/user_guide_src/source/documentation/ELDocs.tmbundle.zip
new file mode 100644
index 0000000..f7a11b3
--- /dev/null
+++ b/user_guide_src/source/documentation/ELDocs.tmbundle.zip
Binary files differ
diff --git a/user_guide_src/source/documentation/index.rst b/user_guide_src/source/documentation/index.rst
new file mode 100644
index 0000000..d62920f
--- /dev/null
+++ b/user_guide_src/source/documentation/index.rst
@@ -0,0 +1,195 @@
+#################################
+Writing CodeIgniter Documentation
+#################################
+
+CodeIgniter uses Sphinx to generate its documentation in a variety of formats,
+using reStructuredText to handle the formatting.  If you are familiar with
+Markdown or Textile, you will quickly grasp reStructuredText.  The focus is
+on readability, user friendliness, and an "I've got your hand, baby" feel.
+While they can be quite technical, we always write for humans!
+
+A table of contents should always be included like the one below.
+It is created automatically by inserting the ``.. contents::``
+directive on a line by itself.
+
+.. contents:: Page Contents
+
+
+**************
+Tools Required
+**************
+
+To see the rendered HTML, ePub, PDF, etc., you will need to install Sphinx
+along with the PHP domain extension for Sphinx.  The underlying requirement
+is to have Python installed.  Lastly, you will install the CI Lexer for
+Pygments, so that code blocks can be properly highlighted.
+
+.. code-block:: bash
+
+	easy_install sphinx
+	easy_install sphinxcontrib-phpdomain
+
+Then follow the directions in the README file in the :samp:`cilexer` folder
+inside the documentation repository to install the CI Lexer.
+
+
+
+*****************************************
+Page and Section Headings and Subheadings
+*****************************************
+
+Headings not only provide order and sections within a page, but they also
+are used to automatically build both the page and document table of contents.
+Headings are formed by using certain characters as underlines for a bit of
+text.  Major headings, like page titles and section headings also use
+overlines.  Other headings just use underlines, with the following hierarchy::
+
+	# with overline for page titles
+	* with overline for major sections
+	= for subsections
+	- for subsubsections
+	^ for subsubsubsections
+	" for subsubsubsubsections (!)
+	
+The :download:`TextMate ELDocs Bundle <./ELDocs.tmbundle.zip>` can help you
+create these with the following tab triggers::
+
+	title->
+	
+		##########
+		Page Title
+		##########
+
+	sec->
+	
+		*************
+		Major Section
+		*************
+		
+	sub->
+	
+		Subsection
+		==========
+		
+	sss->
+	
+		SubSubSection
+		-------------
+		
+	ssss->
+	
+		SubSubSubSection
+		^^^^^^^^^^^^^^^^
+		
+	sssss->
+	
+		SubSubSubSubSection (!)
+		"""""""""""""""""""""""
+
+
+
+
+********************
+Method Documentation
+********************
+
+When documenting class methods for third party developers, Sphinx provides
+directives to assist and keep things simple.  For example, consider the following
+ReST:
+
+.. code-block:: rst
+
+	.. php:class:: Some_class
+
+	some_method()
+	=============
+
+		.. php:method:: some_method ( $foo [, $bar [, $bat]])
+
+			This function will perform some action. The ``$bar`` array must contain
+			a something and something else, and along with ``$bat`` is an optional
+			parameter.
+
+			:param int $foo: the foo id to do something in
+			:param mixed $bar: A data array that must contain aa something and something else
+			:param bool $bat: whether or not to do something
+			:returns: FALSE on failure, TRUE if successful
+			:rtype: Boolean
+		
+			::
+
+				$this->EE->load->library('some_class');
+
+				$bar = array(
+					'something'		=> 'Here is this parameter!',
+					'something_else'	=> 42
+				);
+
+				$bat = $this->EE->some_class->should_do_something();
+
+				if ($this->EE->some_class->some_method(4, $bar, $bat) === FALSE)
+				{
+					show_error('An Error Occurred Doing Some Method');
+				}
+		
+			.. note:: Here is something that you should be aware of when using some_method().
+					For real.
+					
+			See also :php:meth:`Some_class::should_do_something`
+
+	should_do_something()
+	=====================
+
+		.. php:method:: should_do_something()
+
+			:returns: whether or something should be done or not
+			:rtype: Boolean
+
+
+It creates the following display:
+
+.. php:class:: Some_class
+
+some_method()
+=============
+
+	.. php:method:: some_method ( $foo [, $bar [, $bat]])
+
+		This function will perform some action. The ``$bar`` array must contain
+		a something and something else, and along with ``$bat`` is an optional
+		parameter.
+
+		:param int $foo: the foo id to do something in
+		:param mixed $bar: A data array that must contain aa something and something else
+		:param bool $bat: whether or not to do something
+		:returns: FALSE on failure, TRUE if successful
+		:rtype: Boolean
+		
+		::
+
+			$this->EE->load->library('some_class');
+
+			$bar = array(
+				'something'		=> 'Here is this parameter!',
+				'something_else'	=> 42
+			);
+
+			$bat = $this->EE->some_class->should_do_something();
+
+			if ($this->EE->some_class->some_method(4, $bar, $bat) === FALSE)
+			{
+				show_error('An Error Occurred Doing Some Method');
+			}
+		
+		.. note:: Here is something that you should be aware of when using some_method().
+				For real.
+				
+		See also :php:meth:`Some_class::should_do_something`
+
+should_do_something()
+=====================
+
+	.. php:method:: should_do_something()
+
+		:returns: whether or something should be done or not
+		:rtype: Boolean
diff --git a/user_guide_src/source/general/alternative_php.rst b/user_guide_src/source/general/alternative_php.rst
new file mode 100644
index 0000000..45c3671
--- /dev/null
+++ b/user_guide_src/source/general/alternative_php.rst
@@ -0,0 +1,56 @@
+###################################
+Alternate PHP Syntax for View Files
+###################################
+
+If you do not utilize CodeIgniter's :doc:`template
+engine <../libraries/parser>`, you'll be using pure PHP in your
+View files. To minimize the PHP code in these files, and to make it
+easier to identify the code blocks it is recommended that you use PHPs
+alternative syntax for control structures and short tag echo statements.
+If you are not familiar with this syntax, it allows you to eliminate the
+braces from your code, and eliminate "echo" statements.
+
+Automatic Short Tag Support
+===========================
+
+.. note:: If you find that the syntax described in this page does not
+	work on your server it might be that "short tags" are disabled in your
+	PHP ini file. CodeIgniter will optionally rewrite short tags on-the-fly,
+	allowing you to use that syntax even if your server doesn't support it.
+	This feature can be enabled in your config/config.php file.
+
+Please note that if you do use this feature, if PHP errors are
+encountered in your **view files**, the error message and line number
+will not be accurately shown. Instead, all errors will be shown as
+eval() errors.
+
+Alternative Echos
+=================
+
+Normally to echo, or print out a variable you would do this::
+
+	<?php echo $variable; ?>
+
+With the alternative syntax you can instead do it this way::
+
+	<?=$variable?>
+
+Alternative Control Structures
+==============================
+
+Controls structures, like if, for, foreach, and while can be written in
+a simplified format as well. Here is an example using foreach::
+
+	 <ul>  <?php foreach ($todo as $item): ?>  <li><?=$item?></li>  <?php endforeach; ?>  </ul>
+
+Notice that there are no braces. Instead, the end brace is replaced with
+endforeach. Each of the control structures listed above has a similar
+closing syntax: endif, endfor, endforeach, and endwhile
+
+Also notice that instead of using a semicolon after each structure
+(except the last one), there is a colon. This is important!
+
+Here is another example, using if/elseif/else. Notice the colons::
+
+	<?php if ($username == 'sally'): ?>     <h3>Hi Sally</h3>  <?php elseif ($username == 'joe'): ?>     <h3>Hi Joe</h3>  <?php else: ?>     <h3>Hi unknown user</h3>  <?php endif; ?>
+
diff --git a/user_guide_src/source/general/ancillary_classes.rst b/user_guide_src/source/general/ancillary_classes.rst
new file mode 100644
index 0000000..29f1760
--- /dev/null
+++ b/user_guide_src/source/general/ancillary_classes.rst
@@ -0,0 +1,41 @@
+##########################
+Creating Ancillary Classes
+##########################
+
+In some cases you may want to develop classes that exist apart from your
+controllers but have the ability to utilize all of CodeIgniter's
+resources. This is easily possible as you'll see.
+
+get_instance()
+===============
+
+**Any class that you instantiate within your controller functions can
+access CodeIgniter's native resources** simply by using the
+get_instance() function. This function returns the main CodeIgniter
+object.
+
+Normally, to call any of the available CodeIgniter functions requires
+you to use the $this construct::
+
+	 $this->load->helper('url'); $this->load->library('session'); $this->config->item('base_url'); etc.
+
+$this, however, only works within your controllers, your models, or your
+views. If you would like to use CodeIgniter's classes from within your
+own custom classes you can do so as follows:
+
+First, assign the CodeIgniter object to a variable::
+
+	$CI =& get_instance();
+
+Once you've assigned the object to a variable, you'll use that variable
+*instead* of $this::
+
+	 $CI =& get_instance(); $CI->load->helper('url'); $CI->load->library('session'); $CI->config->item('base_url'); etc.
+
+.. note:: You'll notice that the above get_instance() function is being
+	passed by reference::
+
+ 		$CI =& get_instance();
+	
+	This is very important. Assigning by reference allows you to use the
+	original CodeIgniter object rather than creating a copy of it.
diff --git a/user_guide_src/source/general/autoloader.rst b/user_guide_src/source/general/autoloader.rst
new file mode 100644
index 0000000..259a498
--- /dev/null
+++ b/user_guide_src/source/general/autoloader.rst
@@ -0,0 +1,23 @@
+######################
+Auto-loading Resources
+######################
+
+CodeIgniter comes with an "Auto-load" feature that permits libraries,
+helpers, and models to be initialized automatically every time the
+system runs. If you need certain resources globally throughout your
+application you should consider auto-loading them for convenience.
+
+The following items can be loaded automatically:
+
+-  Core classes found in the "libraries" folder
+-  Helper files found in the "helpers" folder
+-  Custom config files found in the "config" folder
+-  Language files found in the "system/language" folder
+-  Models found in the "models" folder
+
+To autoload resources, open the application/config/autoload.php file and
+add the item you want loaded to the autoload array. You'll find
+instructions in that file corresponding to each type of item.
+
+.. note:: Do not include the file extension (.php) when adding items to
+	the autoload array.
diff --git a/user_guide_src/source/general/caching.rst b/user_guide_src/source/general/caching.rst
new file mode 100644
index 0000000..8cc8e5c
--- /dev/null
+++ b/user_guide_src/source/general/caching.rst
@@ -0,0 +1,58 @@
+################
+Web Page Caching
+################
+
+CodeIgniter lets you cache your pages in order to achieve maximum
+performance.
+
+Although CodeIgniter is quite fast, the amount of dynamic information
+you display in your pages will correlate directly to the server
+resources, memory, and processing cycles utilized, which affect your
+page load speeds. By caching your pages, since they are saved in their
+fully rendered state, you can achieve performance that nears that of
+static web pages.
+
+How Does Caching Work?
+======================
+
+Caching can be enabled on a per-page basis, and you can set the length
+of time that a page should remain cached before being refreshed. When a
+page is loaded for the first time, the cache file will be written to
+your application/cache folder. On subsequent page loads the cache file
+will be retrieved and sent to the requesting user's browser. If it has
+expired, it will be deleted and refreshed before being sent to the
+browser.
+
+Note: The Benchmark tag is not cached so you can still view your page
+load speed when caching is enabled.
+
+Enabling Caching
+================
+
+To enable caching, put the following tag in any of your controller
+functions::
+
+	$this->output->cache(n);
+
+Where n is the number of **minutes** you wish the page to remain cached
+between refreshes.
+
+The above tag can go anywhere within a function. It is not affected by
+the order that it appears, so place it wherever it seems most logical to
+you. Once the tag is in place, your pages will begin being cached.
+
+**Warning:** Because of the way CodeIgniter stores content for output,
+caching will only work if you are generating display for your controller
+with a :doc:`view <./views>`.
+
+.. note:: Before the cache files can be written you must set the file
+	permissions on your application/cache folder such that it is writable.
+
+Deleting Caches
+===============
+
+If you no longer wish to cache a file you can remove the caching tag and
+it will no longer be refreshed when it expires. Note: Removing the tag
+will not delete the cache immediately. It will have to expire normally.
+If you need to remove it earlier you will need to manually delete it
+from your cache folder.
diff --git a/user_guide_src/source/general/cli.rst b/user_guide_src/source/general/cli.rst
new file mode 100644
index 0000000..e6f8125
--- /dev/null
+++ b/user_guide_src/source/general/cli.rst
@@ -0,0 +1,68 @@
+###################
+Running via the CLI
+###################
+
+As well as calling an applications :doc:`Controllers <./controllers>`
+via the URL in a browser they can also be loaded via the command-line
+interface (CLI).
+
+-  `What is the CLI? <#what>`_
+-  `Why use this method? <#why>`_
+-  `How does it work? <#how>`_
+
+What is the CLI?
+================
+
+The command-line interface is a text-based method of interacting with
+computers. For more information, check the `Wikipedia
+article <http://en.wikipedia.org/wiki/Command-line_interface>`_.
+
+Why run via the command-line?
+=============================
+
+There are many reasons for running CodeIgniter from the command-line,
+but they are not always obvious.
+
+-  Run your cron-jobs without needing to use wget or curl
+-  Make your cron-jobs inaccessible from being loaded in the URL by
+   checking for ``$this->input->is_cli_request()``
+-  Make interactive "tasks" that can do things like set permissions,
+   prune cache folders, run backups, etc.
+-  Integrate with other applications in other languages. For example, a
+   random C++ script could call one command and run code in your models!
+
+Let's try it: Hello World!
+==========================
+
+Let's create a simple controller so you can see it in action. Using your
+text editor, create a file called tools.php, and put the following code
+in it:
+
+<?php class Tools extends CI_Controller { public function message($to =
+'World') { echo "Hello {$to}!".PHP_EOL; } } ?>
+Then save the file to your application/controllers/ folder.
+
+Now normally you would visit the your site using a URL similar to this::
+
+	example.com/index.php/tools/message/to
+
+Instead, we are going to open Terminal in Mac/Lunix or go to Run > "cmd"
+in Windows and navigate to our CodeIgniter project.
+
+	$ cd /path/to/project;
+	$ php index.php tools message
+
+If you did it right, you should see Hello World!.
+
+	$ php index.php tools message "John Smith"
+
+Here we are passing it a argument in the same way that URL parameters
+work. "John Smith" is passed as a argument and output is: Hello John
+Smith!.
+
+That's it!
+==========
+
+That, in a nutshell, is all there is to know about controllers on the
+command line. Remember that this is just a normal controller, so routing
+and _remap works fine.
diff --git a/user_guide_src/source/general/common_functions.rst b/user_guide_src/source/general/common_functions.rst
new file mode 100644
index 0000000..73b6bcc
--- /dev/null
+++ b/user_guide_src/source/general/common_functions.rst
@@ -0,0 +1,71 @@
+################
+Common Functions
+################
+
+CodeIgniter uses a few functions for its operation that are globally
+defined, and are available to you at any point. These do not require
+loading any libraries or helpers.
+
+is_php('version_number')
+==========================
+
+is_php() determines of the PHP version being used is greater than the
+supplied version_number.
+
+::
+
+	if (is_php('5.3.0')) {     $str = quoted_printable_encode($str); }
+
+Returns boolean TRUE if the installed version of PHP is equal to or
+greater than the supplied version number. Returns FALSE if the installed
+version of PHP is lower than the supplied version number.
+
+is_really_writable('path/to/file')
+====================================
+
+is_writable() returns TRUE on Windows servers when you really can't
+write to the file as the OS reports to PHP as FALSE only if the
+read-only attribute is marked. This function determines if a file is
+actually writable by attempting to write to it first. Generally only
+recommended on platforms where this information may be unreliable.
+
+::
+
+	if (is_really_writable('file.txt')) {     echo "I could write to this if I wanted to"; } else {     echo "File is not writable"; }
+
+config_item('item_key')
+=========================
+
+The :doc:`Config library <../libraries/config>` is the preferred way of
+accessing configuration information, however config_item() can be used
+to retrieve single keys. See Config library documentation for more
+information.
+
+show_error('message'), show_404('page'), log_message('level',
+'message')
+==========
+
+These are each outlined on the :doc:`Error Handling <errors>` page.
+
+set_status_header(code, 'text');
+==================================
+
+Permits you to manually set a server status header. Example::
+
+	set_status_header(401); // Sets the header as:  Unauthorized
+
+`See here <http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html>`_ for
+a full list of headers.
+
+remove_invisible_characters($str)
+===================================
+
+This function prevents inserting null characters between ascii
+characters, like Java\\0script.
+
+html_escape($mixed)
+====================
+
+This function provides short cut for htmlspecialchars() function. It
+accepts string and array. To prevent Cross Site Scripting (XSS), it is
+very useful.
diff --git a/user_guide_src/source/general/controllers.rst b/user_guide_src/source/general/controllers.rst
new file mode 100644
index 0000000..8f02df2
--- /dev/null
+++ b/user_guide_src/source/general/controllers.rst
@@ -0,0 +1,258 @@
+###########
+Controllers
+###########
+
+Controllers are the heart of your application, as they determine how
+HTTP requests should be handled.
+
+-  `What is a Controller? <#what>`_
+-  `Hello World <#hello>`_
+-  `Functions <#functions>`_
+-  `Passing URI Segments to Your Functions <#passinguri>`_
+-  `Defining a Default Controller <#default>`_
+-  `Remapping Function Calls <#remapping>`_
+-  `Controlling Output Data <#output>`_
+-  `Private Functions <#private>`_
+-  `Organizing Controllers into Sub-folders <#subfolders>`_
+-  `Class Constructors <#constructors>`_
+-  `Reserved Function Names <#reserved>`_
+
+What is a Controller?
+=====================
+
+A Controller is simply a class file that is named in a way that can be
+associated with a URI.
+
+Consider this URI::
+
+	example.com/index.php/blog/
+
+In the above example, CodeIgniter would attempt to find a controller
+named blog.php and load it.
+
+**When a controller's name matches the first segment of a URI, it will
+be loaded.**
+
+Let's try it: Hello World!
+==========================
+
+Let's create a simple controller so you can see it in action. Using your
+text editor, create a file called blog.php, and put the following code
+in it:
+
+<?php class Blog extends CI_Controller { public function index() { echo
+'Hello World!'; } } ?>
+Then save the file to your application/controllers/ folder.
+
+Now visit the your site using a URL similar to this::
+
+	example.com/index.php/blog/
+
+If you did it right, you should see Hello World!.
+
+Note: Class names must start with an uppercase letter. In other words,
+this is valid::
+
+	<?php class Blog extends CI_Controller {  } ?>
+
+This is **not** valid::
+
+	<?php class blog extends CI_Controller {  } ?>
+
+Also, always make sure your controller extends the parent controller
+class so that it can inherit all its functions.
+
+Functions
+=========
+
+In the above example the function name is index(). The "index" function
+is always loaded by default if the **second segment** of the URI is
+empty. Another way to show your "Hello World" message would be this::
+
+	example.com/index.php/blog/index/
+
+**The second segment of the URI determines which function in the
+controller gets called.**
+
+Let's try it. Add a new function to your controller:
+
+<?php class Blog extends CI_Controller { public function index() { echo
+'Hello World!'; } public function comments() { echo 'Look at this!'; } }
+?>
+Now load the following URL to see the comment function::
+
+	example.com/index.php/blog/comments/
+
+You should see your new message.
+
+Passing URI Segments to your Functions
+======================================
+
+If your URI contains more then two segments they will be passed to your
+function as parameters.
+
+For example, lets say you have a URI like this::
+
+	example.com/index.php/products/shoes/sandals/123
+
+Your function will be passed URI segments 3 and 4 ("sandals" and "123")::
+
+	 <?php class Products extends CI_Controller {      public function shoes($sandals, $id)     {         echo $sandals;         echo $id;     } } ?>
+
+.. important:: If you are using the :doc:`URI Routing <routing>`
+	feature, the segments passed to your function will be the re-routed
+	ones.
+
+Defining a Default Controller
+=============================
+
+CodeIgniter can be told to load a default controller when a URI is not
+present, as will be the case when only your site root URL is requested.
+To specify a default controller, open your application/config/routes.php
+file and set this variable::
+
+	$route['default_controller'] = 'Blog';
+
+Where Blog is the name of the controller class you want used. If you now
+load your main index.php file without specifying any URI segments you'll
+see your Hello World message by default.
+
+Remapping Function Calls
+========================
+
+As noted above, the second segment of the URI typically determines which
+function in the controller gets called. CodeIgniter permits you to
+override this behavior through the use of the _remap() function::
+
+	public function _remap() {     // Some code here... }
+
+.. important:: If your controller contains a function named _remap(),
+	it will **always** get called regardless of what your URI contains. It
+	overrides the normal behavior in which the URI determines which function
+	is called, allowing you to define your own function routing rules.
+
+The overridden function call (typically the second segment of the URI)
+will be passed as a parameter to the _remap() function::
+
+	public function _remap($method) {     if ($method == 'some_method')     {         $this->$method();     }     else     {         $this->default_method();     } }
+
+Any extra segments after the method name are passed into _remap() as an
+optional second parameter. This array can be used in combination with
+PHP's `call_user_func_array <http://php.net/call_user_func_array>`_
+to emulate CodeIgniter's default behavior.
+
+::
+
+	public function _remap($method, $params = array()) {     $method = 'process_'.$method;     if (method_exists($this, $method))     {         return call_user_func_array(array($this, $method), $params);     }     show_404(); }
+
+Processing Output
+=================
+
+CodeIgniter has an output class that takes care of sending your final
+rendered data to the web browser automatically. More information on this
+can be found in the :doc::doc:`Views <views>` and `Output
+class <../libraries/output>` pages. In some cases, however, you
+might want to post-process the finalized data in some way and send it to
+the browser yourself. CodeIgniter permits you to add a function named
+_output() to your controller that will receive the finalized output
+data.
+
+.. important:: If your controller contains a function named _output(),
+	it will **always** be called by the output class instead of echoing the
+	finalized data directly. The first parameter of the function will
+	contain the finalized output.
+
+Here is an example::
+
+	 public function _output($output) {     echo $output; }
+
+Please note that your _output() function will receive the data in its
+finalized state. Benchmark and memory usage data will be rendered, cache
+files written (if you have caching enabled), and headers will be sent
+(if you use that :doc:`feature <../libraries/output>`) before it is
+handed off to the _output() function.
+To have your controller's output cached properly, its _output() method
+can use::
+
+	if ($this->output->cache_expiration > 0) {     $this->output->_write_cache($output); }
+
+If you are using this feature the page execution timer and memory usage
+stats might not be perfectly accurate since they will not take into
+acccount any further processing you do. For an alternate way to control
+output *before* any of the final processing is done, please see the
+available methods in the :doc:`Output Class <../libraries/output>`.
+
+Private Functions
+=================
+
+In some cases you may want certain functions hidden from public access.
+To make a function private, simply add an underscore as the name prefix
+and it will not be served via a URL request. For example, if you were to
+have a function like this::
+
+	 private function _utility() {   // some code }
+
+Trying to access it via the URL, like this, will not work::
+
+	example.com/index.php/blog/_utility/
+
+Organizing Your Controllers into Sub-folders
+============================================
+
+If you are building a large application you might find it convenient to
+organize your controllers into sub-folders. CodeIgniter permits you to
+do this.
+
+Simply create folders within your application/controllers directory and
+place your controller classes within them.
+
+.. note:: When using this feature the first segment of your URI must
+	specify the folder. For example, lets say you have a controller located
+	here::
+
+		application/controllers/products/shoes.php
+
+	To call the above controller your URI will look something like this::
+
+		example.com/index.php/products/shoes/show/123
+
+Each of your sub-folders may contain a default controller which will be
+called if the URL contains only the sub-folder. Simply name your default
+controller as specified in your application/config/routes.php file
+
+CodeIgniter also permits you to remap your URIs using its :doc:`URI
+Routing <routing>` feature.
+
+Class Constructors
+==================
+
+If you intend to use a constructor in any of your Controllers, you
+**MUST** place the following line of code in it::
+
+	parent::__construct();
+
+The reason this line is necessary is because your local constructor will
+be overriding the one in the parent controller class so we need to
+manually call it.
+
+::
+
+	 <?php class Blog extends CI_Controller {         public function __construct()        {             parent::__construct();             // Your own constructor code        } } ?>
+
+Constructors are useful if you need to set some default values, or run a
+default process when your class is instantiated. Constructors can't
+return a value, but they can do some default work.
+
+Reserved Function Names
+=======================
+
+Since your controller classes will extend the main application
+controller you must be careful not to name your functions identically to
+the ones used by that class, otherwise your local functions will
+override them. See :doc:`Reserved Names <reserved_names>` for a full
+list.
+
+That's it!
+==========
+
+That, in a nutshell, is all there is to know about controllers.
diff --git a/user_guide_src/source/general/core_classes.rst b/user_guide_src/source/general/core_classes.rst
new file mode 100644
index 0000000..8cd3a93
--- /dev/null
+++ b/user_guide_src/source/general/core_classes.rst
@@ -0,0 +1,99 @@
+############################
+Creating Core System Classes
+############################
+
+Every time CodeIgniter runs there are several base classes that are
+initialized automatically as part of the core framework. It is possible,
+however, to swap any of the core system classes with your own versions
+or even extend the core versions.
+
+**Most users will never have any need to do this, but the option to
+replace or extend them does exist for those who would like to
+significantly alter the CodeIgniter core.**
+
+.. note:: Messing with a core system class has a lot of implications, so
+	make sure you know what you are doing before attempting it.
+
+System Class List
+=================
+
+The following is a list of the core system files that are invoked every
+time CodeIgniter runs:
+
+-  Benchmark
+-  Config
+-  Controller
+-  Exceptions
+-  Hooks
+-  Input
+-  Language
+-  Loader
+-  Log
+-  Output
+-  Router
+-  URI
+-  Utf8
+
+Replacing Core Classes
+======================
+
+To use one of your own system classes instead of a default one simply
+place your version inside your local application/core directory::
+
+	application/core/some-class.php
+
+If this directory does not exist you can create it.
+
+Any file named identically to one from the list above will be used
+instead of the one normally used.
+
+Please note that your class must use CI as a prefix. For example, if
+your file is named Input.php the class will be named::
+
+	 class CI_Input {  }
+
+Extending Core Class
+====================
+
+If all you need to do is add some functionality to an existing library -
+perhaps add a function or two - then it's overkill to replace the entire
+library with your version. In this case it's better to simply extend the
+class. Extending a class is nearly identical to replacing a class with a
+couple exceptions:
+
+-  The class declaration must extend the parent class.
+-  Your new class name and filename must be prefixed with MY\_ (this
+   item is configurable. See below.).
+
+For example, to extend the native Input class you'll create a file named
+application/core/MY_Input.php, and declare your class with::
+
+	 class MY_Input extends CI_Input {  }
+
+Note: If you need to use a constructor in your class make sure you
+extend the parent constructor::
+
+	 class MY_Input extends CI_Input {      function __construct()     {         parent::__construct();     } }
+
+**Tip:** Any functions in your class that are named identically to the
+functions in the parent class will be used instead of the native ones
+(this is known as "method overriding"). This allows you to substantially
+alter the CodeIgniter core.
+
+If you are extending the Controller core class, then be sure to extend
+your new class in your application controller's constructors.
+
+::
+
+	class Welcome extends MY_Controller {      function __construct()     {         parent::__construct();     }      function index()     {         $this->load->view('welcome_message');     } }
+
+Setting Your Own Prefix
+-----------------------
+
+To set your own sub-class prefix, open your
+application/config/config.php file and look for this item::
+
+	$config['subclass_prefix'] = 'MY_';
+
+Please note that all native CodeIgniter libraries are prefixed with CI\_
+so DO NOT use that as your prefix.
diff --git a/user_guide_src/source/general/creating_drivers.rst b/user_guide_src/source/general/creating_drivers.rst
new file mode 100644
index 0000000..0e22e4f
--- /dev/null
+++ b/user_guide_src/source/general/creating_drivers.rst
@@ -0,0 +1,20 @@
+################
+Creating Drivers
+################
+
+Driver Directory and File Structure
+===================================
+
+Sample driver directory and file structure layout:
+
+-  /application/libraries/Driver_name
+
+   -  Driver_name.php
+   -  drivers
+
+      -  Driver_name_subclass_1.php
+      -  Driver_name_subclass_2.php
+      -  Driver_name_subclass_3.php
+
+**NOTE:** In order to maintain compatibility on case-sensitive file
+systems, the Driver_name directory must be ucfirst()
diff --git a/user_guide_src/source/general/creating_libraries.rst b/user_guide_src/source/general/creating_libraries.rst
new file mode 100644
index 0000000..d322f56
--- /dev/null
+++ b/user_guide_src/source/general/creating_libraries.rst
@@ -0,0 +1,187 @@
+##################
+Creating Libraries
+##################
+
+When we use the term "Libraries" we are normally referring to the
+classes that are located in the libraries directory and described in the
+Class Reference of this user guide. In this case, however, we will
+instead describe how you can create your own libraries within your
+application/libraries directory in order to maintain separation between
+your local resources and the global framework resources.
+
+As an added bonus, CodeIgniter permits your libraries to extend native
+classes if you simply need to add some functionality to an existing
+library. Or you can even replace native libraries just by placing
+identically named versions in your application/libraries folder.
+
+In summary:
+
+-  You can create entirely new libraries.
+-  You can extend native libraries.
+-  You can replace native libraries.
+
+The page below explains these three concepts in detail.
+
+.. note:: The Database classes can not be extended or replaced with your
+	own classes. All other classes are able to be replaced/extended.
+
+Storage
+=======
+
+Your library classes should be placed within your application/libraries
+folder, as this is where CodeIgniter will look for them when they are
+initialized.
+
+Naming Conventions
+==================
+
+-  File names must be capitalized. For example: Myclass.php
+-  Class declarations must be capitalized. For example: class Myclass
+-  Class names and file names must match.
+
+The Class File
+==============
+
+Classes should have this basic prototype (Note: We are using the name
+Someclass purely as an example)::
+
+	<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');  class Someclass {      public function some_function()     {     } } /* End of file Someclass.php */
+
+Using Your Class
+================
+
+From within any of your :doc:`Controller <controllers>` functions you
+can initialize your class using the standard::
+
+	$this->load->library('someclass');
+
+Where *someclass* is the file name, without the ".php" file extension.
+You can submit the file name capitalized or lower case. CodeIgniter
+doesn't care.
+
+Once loaded you can access your class using the lower case version::
+
+	$this->someclass->some_function();  // Object instances will always be lower case
+
+Passing Parameters When Initializing Your Class
+===============================================
+
+In the library loading function you can dynamically pass data as an
+array via the second parameter and it will be passed to your class
+constructor::
+
+	 $params = array('type' => 'large', 'color' => 'red');  $this->load->library('Someclass', $params);
+
+If you use this feature you must set up your class constructor to expect
+data::
+
+	<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');  class Someclass {      public function __construct($params)     {         // Do something with $params     } } ?>
+
+You can also pass parameters stored in a config file. Simply create a
+config file named identically to the class file name and store it in
+your application/config/ folder. Note that if you dynamically pass
+parameters as described above, the config file option will not be
+available.
+
+Utilizing CodeIgniter Resources within Your Library
+===================================================
+
+To access CodeIgniter's native resources within your library use the
+get_instance() function. This function returns the CodeIgniter super
+object.
+
+Normally from within your controller functions you will call any of the
+available CodeIgniter functions using the $this construct::
+
+	 $this->load->helper('url'); $this->load->library('session'); $this->config->item('base_url'); etc.
+
+$this, however, only works directly within your controllers, your
+models, or your views. If you would like to use CodeIgniter's classes
+from within your own custom classes you can do so as follows:
+
+First, assign the CodeIgniter object to a variable::
+
+	$CI =& get_instance();
+
+Once you've assigned the object to a variable, you'll use that variable
+*instead* of $this::
+
+	 $CI =& get_instance();  $CI->load->helper('url'); $CI->load->library('session'); $CI->config->item('base_url'); etc.
+
+.. note:: You'll notice that the above get_instance() function is being
+	passed by reference::
+	
+		$CI =& get_instance();
+
+	This is very important. Assigning by reference allows you to use the
+	original CodeIgniter object rather than creating a copy of it.
+
+Replacing Native Libraries with Your Versions
+=============================================
+
+Simply by naming your class files identically to a native library will
+cause CodeIgniter to use it instead of the native one. To use this
+feature you must name the file and the class declaration exactly the
+same as the native library. For example, to replace the native Email
+library you'll create a file named application/libraries/Email.php, and
+declare your class with::
+
+	 class CI_Email {  }
+
+Note that most native classes are prefixed with CI\_.
+
+To load your library you'll see the standard loading function::
+
+	$this->load->library('email');
+
+.. note:: At this time the Database classes can not be replaced with
+	your own versions.
+
+Extending Native Libraries
+==========================
+
+If all you need to do is add some functionality to an existing library -
+perhaps add a function or two - then it's overkill to replace the entire
+library with your version. In this case it's better to simply extend the
+class. Extending a class is nearly identical to replacing a class with a
+couple exceptions:
+
+-  The class declaration must extend the parent class.
+-  Your new class name and filename must be prefixed with MY\_ (this
+   item is configurable. See below.).
+
+For example, to extend the native Email class you'll create a file named
+application/libraries/MY_Email.php, and declare your class with::
+
+	 class MY_Email extends CI_Email {  }
+
+Note: If you need to use a constructor in your class make sure you
+extend the parent constructor::
+
+	 class MY_Email extends CI_Email {      public function __construct()     {         parent::__construct();     } }
+
+Loading Your Sub-class
+----------------------
+
+To load your sub-class you'll use the standard syntax normally used. DO
+NOT include your prefix. For example, to load the example above, which
+extends the Email class, you will use::
+
+	$this->load->library('email');
+
+Once loaded you will use the class variable as you normally would for
+the class you are extending. In the case of the email class all calls
+will use::
+
+	$this->email->some_function();
+
+Setting Your Own Prefix
+-----------------------
+
+To set your own sub-class prefix, open your
+application/config/config.php file and look for this item::
+
+	$config['subclass_prefix'] = 'MY_';
+
+Please note that all native CodeIgniter libraries are prefixed with CI\_
+so DO NOT use that as your prefix.
diff --git a/user_guide_src/source/general/credits.rst b/user_guide_src/source/general/credits.rst
new file mode 100644
index 0000000..2c74598
--- /dev/null
+++ b/user_guide_src/source/general/credits.rst
@@ -0,0 +1,19 @@
+#######
+Credits
+#######
+
+CodeIgniter was originally developed by `Rick
+Ellis <http://www.ellislab.com/>`_ (CEO of `EllisLab,
+Inc. <http://ellislab.com/>`_). The framework was written for
+performance in the real world, with many of the class libraries,
+helpers, and sub-systems borrowed from the code-base of
+`ExpressionEngine <http://www.expressionengine.com/>`_.
+
+It is currently developed and maintained by the ExpressionEngine
+Development Team.
+Bleeding edge development is spearheaded by the handpicked contributors
+of the Reactor Team.
+
+A hat tip goes to Ruby on Rails for inspiring us to create a PHP
+framework, and for bringing frameworks into the general consciousness of
+the web community.
diff --git a/user_guide_src/source/general/drivers.rst b/user_guide_src/source/general/drivers.rst
new file mode 100644
index 0000000..8d0d84a
--- /dev/null
+++ b/user_guide_src/source/general/drivers.rst
@@ -0,0 +1,39 @@
+#########################
+Using CodeIgniter Drivers
+#########################
+
+Drivers are a special type of Library that has a parent class and any
+number of potential child classes. Child classes have access to the
+parent class, but not their siblings. Drivers provide an elegant syntax
+in your :doc:`controllers <controllers>` for libraries that benefit
+from or require being broken down into discrete classes.
+
+Drivers are found in the system/libraries folder, in their own folder
+which is identically named to the parent library class. Also inside that
+folder is a subfolder named drivers, which contains all of the possible
+child class files.
+
+To use a driver you will initialize it within a controller using the
+following initialization function::
+
+	$this->load->driver('class name'); 
+
+Where class name is the name of the driver class you want to invoke. For
+example, to load a driver named "Some Parent" you would do this::
+
+	$this->load->driver('some_parent');
+
+Methods of that class can then be invoked with::
+
+	$this->some_parent->some_method();
+
+The child classes, the drivers themselves, can then be called directly
+through the parent class, without initializing them::
+
+	$this->some_parent->child_one->some_method(); $this->some_parent->child_two->another_method();
+
+Creating Your Own Drivers
+=========================
+
+Please read the section of the user guide that discusses how to :doc:`create
+your own drivers <creating_drivers>`.
diff --git a/user_guide_src/source/general/environments.rst b/user_guide_src/source/general/environments.rst
new file mode 100644
index 0000000..40725fe
--- /dev/null
+++ b/user_guide_src/source/general/environments.rst
@@ -0,0 +1,46 @@
+##############################
+Handling Multiple Environments
+##############################
+
+Developers often desire different system behavior depending on whether
+an application is running in a development or production environment.
+For example, verbose error output is something that would be useful
+while developing an application, but it may also pose a security issue
+when "live".
+
+The ENVIRONMENT Constant
+========================
+
+By default, CodeIgniter comes with the environment constant set to
+'development'. At the top of index.php, you will see::
+
+	 define('ENVIRONMENT', 'development');
+
+In addition to affecting some basic framework behavior (see the next
+section), you may use this constant in your own development to
+differentiate between which environment you are running in.
+
+Effects On Default Framework Behavior
+=====================================
+
+There are some places in the CodeIgniter system where the ENVIRONMENT
+constant is used. This section describes how default framework behavior
+is affected.
+
+Error Reporting
+---------------
+
+Setting the ENVIRONMENT constant to a value of 'development' will cause
+all PHP errors to be rendered to the browser when they occur.
+Conversely, setting the constant to 'production' will disable all error
+output. Disabling error reporting in production is a :doc:`good security
+practice <security>`.
+
+Configuration Files
+-------------------
+
+Optionally, you can have CodeIgniter load environment-specific
+configuration files. This may be useful for managing things like
+differing API keys across multiple environments. This is described in
+more detail in the environment section of the `Config
+Class <../libraries/config.html#environments>`_ documentation.
diff --git a/user_guide_src/source/general/errors.rst b/user_guide_src/source/general/errors.rst
new file mode 100644
index 0000000..0764e9d
--- /dev/null
+++ b/user_guide_src/source/general/errors.rst
@@ -0,0 +1,75 @@
+##############
+Error Handling
+##############
+
+CodeIgniter lets you build error reporting into your applications using
+the functions described below. In addition, it has an error logging
+class that permits error and debugging messages to be saved as text
+files.
+
+.. note:: By default, CodeIgniter displays all PHP errors. You might
+	wish to change this behavior once your development is complete. You'll
+	find the error_reporting() function located at the top of your main
+	index.php file. Disabling error reporting will NOT prevent log files
+	from being written if there are errors.
+
+Unlike most systems in CodeIgniter, the error functions are simple
+procedural interfaces that are available globally throughout the
+application. This approach permits error messages to get triggered
+without having to worry about class/function scoping.
+
+The following functions let you generate errors:
+
+show_error('message' [, int $status_code= 500 ] )
+===================================================
+
+This function will display the error message supplied to it using the
+following error template:
+
+application/errors/error_general.php
+
+The optional parameter $status_code determines what HTTP status code
+should be sent with the error.
+
+show_404('page' [, 'log_error'])
+==================================
+
+This function will display the 404 error message supplied to it using
+the following error template:
+
+application/errors/error_404.php
+
+The function expects the string passed to it to be the file path to the
+page that isn't found. Note that CodeIgniter automatically shows 404
+messages if controllers are not found.
+
+CodeIgniter automatically logs any show_404() calls. Setting the
+optional second parameter to FALSE will skip logging.
+
+log_message('level', 'message')
+================================
+
+This function lets you write messages to your log files. You must supply
+one of three "levels" in the first parameter, indicating what type of
+message it is (debug, error, info), with the message itself in the
+second parameter. Example::
+
+	 if ($some_var == "") {     log_message('error', 'Some variable did not contain a value.'); } else {     log_message('debug', 'Some variable was correctly set'); }  log_message('info', 'The purpose of some variable is to provide some value.');
+
+There are three message types:
+
+#. Error Messages. These are actual errors, such as PHP errors or user
+   errors.
+#. Debug Messages. These are messages that assist in debugging. For
+   example, if a class has been initialized, you could log this as
+   debugging info.
+#. Informational Messages. These are the lowest priority messages,
+   simply giving information regarding some process. CodeIgniter doesn't
+   natively generate any info messages but you may want to in your
+   application.
+
+.. note:: In order for the log file to actually be written, the "logs"
+	folder must be writable. In addition, you must set the "threshold" for
+	logging in application/config/config.php. You might, for example, only
+	want error messages to be logged, and not the other two types. If you
+	set it to zero logging will be disabled.
diff --git a/user_guide_src/source/general/helpers.rst b/user_guide_src/source/general/helpers.rst
new file mode 100644
index 0000000..2b113c1
--- /dev/null
+++ b/user_guide_src/source/general/helpers.rst
@@ -0,0 +1,123 @@
+################
+Helper Functions
+################
+
+Helpers, as the name suggests, help you with tasks. Each helper file is
+simply a collection of functions in a particular category. There are URL
+Helpers, that assist in creating links, there are Form Helpers that help
+you create form elements, Text Helpers perform various text formatting
+routines, Cookie Helpers set and read cookies, File Helpers help you
+deal with files, etc.
+
+Unlike most other systems in CodeIgniter, Helpers are not written in an
+Object Oriented format. They are simple, procedural functions. Each
+helper function performs one specific task, with no dependence on other
+functions.
+
+CodeIgniter does not load Helper Files by default, so the first step in
+using a Helper is to load it. Once loaded, it becomes globally available
+in your :doc:`controller <../general/controllers>` and
+:doc:`views <../general/views>`.
+
+Helpers are typically stored in your system/helpers, or
+application/helpers directory. CodeIgniter will look first in your
+application/helpers directory. If the directory does not exist or the
+specified helper is not located there CI will instead look in your
+global system/helpers folder.
+
+Loading a Helper
+================
+
+Loading a helper file is quite simple using the following function::
+
+	$this->load->helper('name');
+
+Where name is the file name of the helper, without the .php file
+extension or the "helper" part.
+
+For example, to load the URL Helper file, which is named
+url_helper.php, you would do this::
+
+	$this->load->helper('url');
+
+A helper can be loaded anywhere within your controller functions (or
+even within your View files, although that's not a good practice), as
+long as you load it before you use it. You can load your helpers in your
+controller constructor so that they become available automatically in
+any function, or you can load a helper in a specific function that needs
+it.
+
+Note: The Helper loading function above does not return a value, so
+don't try to assign it to a variable. Just use it as shown.
+
+Loading Multiple Helpers
+========================
+
+If you need to load more than one helper you can specify them in an
+array, like this::
+
+	$this->load->helper( array('helper1', 'helper2', 'helper3') );
+
+Auto-loading Helpers
+====================
+
+If you find that you need a particular helper globally throughout your
+application, you can tell CodeIgniter to auto-load it during system
+initialization. This is done by opening the
+application/config/autoload.php file and adding the helper to the
+autoload array.
+
+Using a Helper
+==============
+
+Once you've loaded the Helper File containing the function you intend to
+use, you'll call it the way you would a standard PHP function.
+
+For example, to create a link using the anchor() function in one of your
+view files you would do this::
+
+	<?php echo anchor('blog/comments', 'Click Here');?>
+
+Where "Click Here" is the name of the link, and "blog/comments" is the
+URI to the controller/function you wish to link to.
+
+"Extending" Helpers
+===================
+
+To "extend" Helpers, create a file in your application/helpers/ folder
+with an identical name to the existing Helper, but prefixed with MY\_
+(this item is configurable. See below.).
+
+If all you need to do is add some functionality to an existing helper -
+perhaps add a function or two, or change how a particular helper
+function operates - then it's overkill to replace the entire helper with
+your version. In this case it's better to simply "extend" the Helper.
+The term "extend" is used loosely since Helper functions are procedural
+and discrete and cannot be extended in the traditional programmatic
+sense. Under the hood, this gives you the ability to add to the
+functions a Helper provides, or to modify how the native Helper
+functions operate.
+
+For example, to extend the native Array Helper you'll create a file
+named application/helpers/MY_array_helper.php, and add or override
+functions::
+
+	 // any_in_array() is not in the Array Helper, so it defines a new function function any_in_array($needle, $haystack) {     $needle = (is_array($needle)) ? $needle : array($needle);          foreach ($needle as $item)     {         if (in_array($item, $haystack))         {             return TRUE;         }         }          return FALSE; }  // random_element() is included in Array Helper, so it overrides the native function function random_element($array) {     shuffle($array);     return array_pop($array); }
+
+Setting Your Own Prefix
+-----------------------
+
+The filename prefix for "extending" Helpers is the same used to extend
+libraries and Core classes. To set your own prefix, open your
+application/config/config.php file and look for this item::
+
+	$config['subclass_prefix'] = 'MY_';
+
+Please note that all native CodeIgniter libraries are prefixed with CI\_
+so DO NOT use that as your prefix.
+
+Now What?
+=========
+
+In the Table of Contents you'll find a list of all the available Helper
+Files. Browse each one to see what they do.
diff --git a/user_guide_src/source/general/hooks.rst b/user_guide_src/source/general/hooks.rst
new file mode 100644
index 0000000..ab42d28
--- /dev/null
+++ b/user_guide_src/source/general/hooks.rst
@@ -0,0 +1,98 @@
+####################################
+Hooks - Extending the Framework Core
+####################################
+
+CodeIgniter's Hooks feature provides a means to tap into and modify the
+inner workings of the framework without hacking the core files. When
+CodeIgniter runs it follows a specific execution process, diagramed in
+the :doc:`Application Flow <../overview/appflow>` page. There may be
+instances, however, where you'd like to cause some action to take place
+at a particular stage in the execution process. For example, you might
+want to run a script right before your controllers get loaded, or right
+after, or you might want to trigger one of your own scripts in some
+other location.
+
+Enabling Hooks
+==============
+
+The hooks feature can be globally enabled/disabled by setting the
+following item in the application/config/config.php file::
+
+	$config['enable_hooks'] = TRUE;
+
+Defining a Hook
+===============
+
+Hooks are defined in application/config/hooks.php file. Each hook is
+specified as an array with this prototype::
+
+	 $hook['pre_controller'] = array(                                 'class'    => 'MyClass',                                 'function' => 'Myfunction',                                 'filename' => 'Myclass.php',                                 'filepath' => 'hooks',                                 'params'   => array('beer', 'wine', 'snacks')                                 );
+
+**Notes:**
+The array index correlates to the name of the particular hook point you
+want to use. In the above example the hook point is pre_controller. A
+list of hook points is found below. The following items should be
+defined in your associative hook array:
+
+-  **class** The name of the class you wish to invoke. If you prefer to
+   use a procedural function instead of a class, leave this item blank.
+-  **function** The function name you wish to call.
+-  **filename** The file name containing your class/function.
+-  **filepath** The name of the directory containing your script. Note:
+   Your script must be located in a directory INSIDE your application
+   folder, so the file path is relative to that folder. For example, if
+   your script is located in application/hooks, you will simply use
+   hooks as your filepath. If your script is located in
+   application/hooks/utilities you will use hooks/utilities as your
+   filepath. No trailing slash.
+-  **params** Any parameters you wish to pass to your script. This item
+   is optional.
+
+Multiple Calls to the Same Hook
+===============================
+
+If want to use the same hook point with more then one script, simply
+make your array declaration multi-dimensional, like this::
+
+	 $hook['pre_controller'][] = array(                                 'class'    => 'MyClass',                                 'function' => 'Myfunction',                                 'filename' => 'Myclass.php',                                 'filepath' => 'hooks',                                 'params'   => array('beer', 'wine', 'snacks')                                 );  $hook['pre_controller'][] = array(                                 'class'    => 'MyOtherClass',                                 'function' => 'MyOtherfunction',                                 'filename' => 'Myotherclass.php',                                 'filepath' => 'hooks',                                 'params'   => array('red', 'yellow', 'blue')                                 );
+
+Notice the brackets after each array index::
+
+	$hook['pre_controller'][]
+
+This permits you to have the same hook point with multiple scripts. The
+order you define your array will be the execution order.
+
+Hook Points
+===========
+
+The following is a list of available hook points.
+
+-  **pre_system**
+   Called very early during system execution. Only the benchmark and
+   hooks class have been loaded at this point. No routing or other
+   processes have happened.
+-  **pre_controller**
+   Called immediately prior to any of your controllers being called.
+   All base classes, routing, and security checks have been done.
+-  **post_controller_constructor**
+   Called immediately after your controller is instantiated, but prior
+   to any method calls happening.
+-  **post_controller**
+   Called immediately after your controller is fully executed.
+-  **display_override**
+   Overrides the _display() function, used to send the finalized page
+   to the web browser at the end of system execution. This permits you
+   to use your own display methodology. Note that you will need to
+   reference the CI superobject with $this->CI =& get_instance() and
+   then the finalized data will be available by calling
+   $this->CI->output->get_output()
+-  **cache_override**
+   Enables you to call your own function instead of the
+   _display_cache() function in the output class. This permits you to
+   use your own cache display mechanism.
+-  **post_system**
+   Called after the final rendered page is sent to the browser, at the
+   end of system execution after the finalized data is sent to the
+   browser.
+
diff --git a/user_guide_src/source/general/index.rst b/user_guide_src/source/general/index.rst
new file mode 100644
index 0000000..1ece12b
--- /dev/null
+++ b/user_guide_src/source/general/index.rst
@@ -0,0 +1,6 @@
+.. toctree::
+	:glob:
+	:hidden:
+	:titlesonly:
+	
+	*
\ No newline at end of file
diff --git a/user_guide_src/source/general/libraries.rst b/user_guide_src/source/general/libraries.rst
new file mode 100644
index 0000000..954a5b8
--- /dev/null
+++ b/user_guide_src/source/general/libraries.rst
@@ -0,0 +1,31 @@
+###########################
+Using CodeIgniter Libraries
+###########################
+
+All of the available libraries are located in your system/libraries
+folder. In most cases, to use one of these classes involves initializing
+it within a :doc:`controller <controllers>` using the following
+initialization function::
+
+	$this->load->library('class name'); 
+
+Where class name is the name of the class you want to invoke. For
+example, to load the form validation class you would do this::
+
+	$this->load->library('form_validation'); 
+
+Once initialized you can use it as indicated in the user guide page
+corresponding to that class.
+
+Additionally, multiple libraries can be loaded at the same time by
+passing an array of libraries to the load function.
+
+::
+
+	$this->load->library(array('email', 'table'));
+
+Creating Your Own Libraries
+===========================
+
+Please read the section of the user guide that discusses how to :doc:`create
+your own libraries <creating_libraries>`
diff --git a/user_guide_src/source/general/managing_apps.rst b/user_guide_src/source/general/managing_apps.rst
new file mode 100644
index 0000000..edc94d2
--- /dev/null
+++ b/user_guide_src/source/general/managing_apps.rst
@@ -0,0 +1,52 @@
+##########################
+Managing your Applications
+##########################
+
+By default it is assumed that you only intend to use CodeIgniter to
+manage one application, which you will build in your application/
+directory. It is possible, however, to have multiple sets of
+applications that share a single CodeIgniter installation, or even to
+rename or relocate your application folder.
+
+Renaming the Application Folder
+===============================
+
+If you would like to rename your application folder you may do so as
+long as you open your main index.php file and set its name using the
+$application_folder variable::
+
+	$application_folder = "application";
+
+Relocating your Application Folder
+==================================
+
+It is possible to move your application folder to a different location
+on your server than your system folder. To do so open your main
+index.php and set a *full server path* in the $application_folder
+variable.
+
+::
+
+	$application_folder = "/Path/to/your/application";
+
+Running Multiple Applications with one CodeIgniter Installation
+===============================================================
+
+If you would like to share a common CodeIgniter installation to manage
+several different applications simply put all of the directories located
+inside your application folder into their own sub-folder.
+
+For example, let's say you want to create two applications, "foo" and
+"bar". You could structure your application folders like this::
+
+	applications/foo/ applications/foo/config/ applications/foo/controllers/ applications/foo/errors/ applications/foo/libraries/ applications/foo/models/ applications/foo/views/ applications/bar/ applications/bar/config/ applications/bar/controllers/ applications/bar/errors/ applications/bar/libraries/ applications/bar/models/ applications/bar/views/
+
+To select a particular application for use requires that you open your
+main index.php file and set the $application_folder variable. For
+example, to select the "foo" application for use you would do this::
+
+	$application_folder = "applications/foo";
+
+.. note:: Each of your applications will need its own index.php file
+	which calls the desired application. The index.php file can be named
+	anything you want.
diff --git a/user_guide_src/source/general/models.rst b/user_guide_src/source/general/models.rst
new file mode 100644
index 0000000..e26207c
--- /dev/null
+++ b/user_guide_src/source/general/models.rst
@@ -0,0 +1,117 @@
+######
+Models
+######
+
+Models are **optionally** available for those who want to use a more
+traditional MVC approach.
+
+-  `What is a Model? <#what>`_
+-  `Anatomy of a Model <#anatomy>`_
+-  `Loading a Model <#loading>`_
+-  `Auto-Loading a Model <#auto_load_model>`_
+-  `Connecting to your Database <#conn>`_
+
+What is a Model?
+================
+
+Models are PHP classes that are designed to work with information in
+your database. For example, let's say you use CodeIgniter to manage a
+blog. You might have a model class that contains functions to insert,
+update, and retrieve your blog data. Here is an example of what such a
+model class might look like::
+
+	 class Blogmodel extends CI_Model {      var $title   = '';     var $content = '';     var $date    = '';      function __construct()     {         // Call the Model constructor         parent::__construct();     }          function get_last_ten_entries()     {         $query = $this->db->get('entries', 10);         return $query->result();     }      function insert_entry()     {         $this->title   = $_POST['title']; // please read the below note         $this->content = $_POST['content'];         $this->date    = time();          $this->db->insert('entries', $this);     }      function update_entry()     {         $this->title   = $_POST['title'];         $this->content = $_POST['content'];         $this->date    = time();          $this->db->update('entries', $this, array('id' => $_POST['id']));     }  }
+
+Note: The functions in the above example use the :doc:`Active
+Record <../database/active_record>` database functions.
+
+.. note:: For the sake of simplicity in this example we're using $_POST
+	directly. This is generally bad practice, and a more common approach
+	would be to use the :doc:`Input Class <../libraries/input>`
+	$this->input->post('title')
+
+Anatomy of a Model
+==================
+
+Model classes are stored in your application/models/ folder. They can be
+nested within sub-folders if you want this type of organization.
+
+The basic prototype for a model class is this::
+
+	 class Model_name extends CI_Model {      function __construct()     {         parent::__construct();     } }
+
+Where Model_name is the name of your class. Class names **must** have
+the first letter capitalized with the rest of the name lowercase. Make
+sure your class extends the base Model class.
+
+The file name will be a lower case version of your class name. For
+example, if your class is this::
+
+	 class User_model extends CI_Model {      function __construct()     {         parent::__construct();     } }
+
+Your file will be this::
+
+	application/models/user_model.php
+
+Loading a Model
+===============
+
+Your models will typically be loaded and called from within your
+:doc:`controller <controllers>` functions. To load a model you will use
+the following function::
+
+	$this->load->model('Model_name');
+
+If your model is located in a sub-folder, include the relative path from
+your models folder. For example, if you have a model located at
+application/models/blog/queries.php you'll load it using::
+
+	$this->load->model('blog/queries');
+
+Once loaded, you will access your model functions using an object with
+the same name as your class::
+
+	 $this->load->model('Model_name');  $this->Model_name->function();
+
+If you would like your model assigned to a different object name you can
+specify it via the second parameter of the loading function::
+
+	 $this->load->model('Model_name', 'fubar');  $this->fubar->function();
+
+Here is an example of a controller, that loads a model, then serves a
+view::
+
+	 class Blog_controller extends CI_Controller {      function blog()     {         $this->load->model('Blog');          $data['query'] = $this->Blog->get_last_ten_entries();         $this->load->view('blog', $data);     } }
+
+Auto-loading Models
+===================
+
+If you find that you need a particular model globally throughout your
+application, you can tell CodeIgniter to auto-load it during system
+initialization. This is done by opening the
+application/config/autoload.php file and adding the model to the
+autoload array.
+
+Connecting to your Database
+===========================
+
+When a model is loaded it does **NOT** connect automatically to your
+database. The following options for connecting are available to you:
+
+-  You can connect using the standard database methods :doc:`described
+   here <../database/connecting>`, either from within your
+   Controller class or your Model class.
+-  You can tell the model loading function to auto-connect by passing
+   TRUE (boolean) via the third parameter, and connectivity settings, as
+   defined in your database config file will be used:
+   ::
+
+	$this->load->model('Model_name', '', TRUE);
+
+-  You can manually pass database connectivity settings via the third
+   parameter:
+   ::
+
+	$config['hostname'] = "localhost";         $config['username'] = "myusername";         $config['password'] = "mypassword";         $config['database'] = "mydatabase";         $config['dbdriver'] = "mysql";         $config['dbprefix'] = "";         $config['pconnect'] = FALSE;         $config['db_debug'] = TRUE;                  $this->load->model('Model_name', '', $config);
+
+
diff --git a/user_guide_src/source/general/profiling.rst b/user_guide_src/source/general/profiling.rst
new file mode 100644
index 0000000..60ef585
--- /dev/null
+++ b/user_guide_src/source/general/profiling.rst
@@ -0,0 +1,98 @@
+##########################
+Profiling Your Application
+##########################
+
+The Profiler Class will display benchmark results, queries you have run,
+and $_POST data at the bottom of your pages. This information can be
+useful during development in order to help with debugging and
+optimization.
+
+Initializing the Class
+======================
+
+.. important:: This class does NOT need to be initialized. It is loaded
+	automatically by the :doc:`Output Class <../libraries/output>` if
+	profiling is enabled as shown below.
+
+Enabling the Profiler
+=====================
+
+To enable the profiler place the following function anywhere within your
+:doc:`Controller <controllers>` functions::
+
+	$this->output->enable_profiler(TRUE);
+
+When enabled a report will be generated and inserted at the bottom of
+your pages.
+
+To disable the profiler you will use::
+
+	$this->output->enable_profiler(FALSE);
+
+Setting Benchmark Points
+========================
+
+In order for the Profiler to compile and display your benchmark data you
+must name your mark points using specific syntax.
+
+Please read the information on setting Benchmark points in :doc:`Benchmark
+Class <../libraries/benchmark>` page.
+
+Enabling and Disabling Profiler Sections
+========================================
+
+Each section of Profiler data can be enabled or disabled by setting a
+corresponding config variable to TRUE or FALSE. This can be done one of
+two ways. First, you can set application wide defaults with the
+application/config/profiler.php config file.
+
+::
+
+	$config['config']          = FALSE;     $config['queries']         = FALSE;
+
+In your controllers, you can override the defaults and config file
+values by calling the set_profiler_sections() method of the :doc:`Output
+class <../libraries/output>`::
+
+	$sections = array(         'config'  => TRUE,         'queries' => TRUE         );          $this->output->set_profiler_sections($sections);
+
+Available sections and the array key used to access them are described
+in the table below.
+
+Key
+Description
+Default
+**benchmarks**
+Elapsed time of Benchmark points and total execution time
+TRUE
+**config**
+CodeIgniter Config variables
+TRUE
+**controller_info**
+The Controller class and method requested
+TRUE
+**get**
+Any GET data passed in the request
+TRUE
+**http_headers**
+The HTTP headers for the current request
+TRUE
+**memory_usage**
+Amount of memory consumed by the current request, in bytes
+TRUE
+**post**
+Any POST data passed in the request
+TRUE
+**queries**
+Listing of all database queries executed, including execution time
+TRUE
+**uri_string**
+The URI of the current request
+TRUE
+**session_data**
+Data stored in the current session
+TRUE
+**query_toggle_count**
+The number of queries after which the query block will default to
+hidden.
+25
diff --git a/user_guide_src/source/general/quick_reference.rst b/user_guide_src/source/general/quick_reference.rst
new file mode 100644
index 0000000..b9108a5
--- /dev/null
+++ b/user_guide_src/source/general/quick_reference.rst
@@ -0,0 +1,11 @@
+#####################
+Quick Reference Chart
+#####################
+
+For a PDF version of this chart, `click
+here <http://codeigniter.com/download_files/ci_quick_ref.pdf>`_.
+
+.. figure:: ../images/ci_quick_ref.png
+   :align: center
+   :alt: 
+
diff --git a/user_guide_src/source/general/requirements.rst b/user_guide_src/source/general/requirements.rst
new file mode 100644
index 0000000..3862355
--- /dev/null
+++ b/user_guide_src/source/general/requirements.rst
@@ -0,0 +1,8 @@
+###################
+Server Requirements
+###################
+
+-  `PHP <http://www.php.net/>`_ version 5.1.6 or newer.
+-  A Database is required for most web application programming. Current
+   supported databases are MySQL (4.1+), MySQLi, MS SQL, Postgres, Oracle,
+   SQLite, ODBC and CUBRID.
\ No newline at end of file
diff --git a/user_guide_src/source/general/reserved_names.rst b/user_guide_src/source/general/reserved_names.rst
new file mode 100644
index 0000000..5ce7fc2
--- /dev/null
+++ b/user_guide_src/source/general/reserved_names.rst
@@ -0,0 +1,66 @@
+##############
+Reserved Names
+##############
+
+In order to help out, CodeIgniter uses a series of functions and names
+in its operation. Because of this, some names cannot be used by a
+developer. Following is a list of reserved names that cannot be used.
+
+Controller names
+----------------
+
+Since your controller classes will extend the main application
+controller you must be careful not to name your functions identically to
+the ones used by that class, otherwise your local functions will
+override them. The following is a list of reserved names. Do not name
+your controller any of these:
+
+-  Controller
+-  CI_Base
+-  _ci_initialize
+-  Default
+-  index
+
+Functions
+---------
+
+-  is_really_writable()
+-  load_class()
+-  get_config()
+-  config_item()
+-  show_error()
+-  show_404()
+-  log_message()
+-  _exception_handler()
+-  get_instance()
+
+Variables
+---------
+
+-  $config
+-  $mimes
+-  $lang
+
+Constants
+---------
+
+-  ENVIRONMENT
+-  EXT
+-  FCPATH
+-  SELF
+-  BASEPATH
+-  APPPATH
+-  CI_VERSION
+-  FILE_READ_MODE
+-  FILE_WRITE_MODE
+-  DIR_READ_MODE
+-  DIR_WRITE_MODE
+-  FOPEN_READ
+-  FOPEN_READ_WRITE
+-  FOPEN_WRITE_CREATE_DESTRUCTIVE
+-  FOPEN_READ_WRITE_CREATE_DESTRUCTIVE
+-  FOPEN_WRITE_CREATE
+-  FOPEN_READ_WRITE_CREATE
+-  FOPEN_WRITE_CREATE_STRICT
+-  FOPEN_READ_WRITE_CREATE_STRICT
+
diff --git a/user_guide_src/source/general/routing.rst b/user_guide_src/source/general/routing.rst
new file mode 100644
index 0000000..45950fc
--- /dev/null
+++ b/user_guide_src/source/general/routing.rst
@@ -0,0 +1,133 @@
+###########
+URI Routing
+###########
+
+Typically there is a one-to-one relationship between a URL string and
+its corresponding controller class/method. The segments in a URI
+normally follow this pattern::
+
+	example.com/class/function/id/
+
+In some instances, however, you may want to remap this relationship so
+that a different class/function can be called instead of the one
+corresponding to the URL.
+
+For example, lets say you want your URLs to have this prototype:
+
+example.com/product/1/
+example.com/product/2/
+example.com/product/3/
+example.com/product/4/
+
+Normally the second segment of the URL is reserved for the function
+name, but in the example above it instead has a product ID. To overcome
+this, CodeIgniter allows you to remap the URI handler.
+
+Setting your own routing rules
+==============================
+
+Routing rules are defined in your application/config/routes.php file. In
+it you'll see an array called $route that permits you to specify your
+own routing criteria. Routes can either be specified using wildcards or
+Regular Expressions
+
+Wildcards
+=========
+
+A typical wildcard route might look something like this::
+
+	$route['product/:num'] = "catalog/product_lookup";
+
+In a route, the array key contains the URI to be matched, while the
+array value contains the destination it should be re-routed to. In the
+above example, if the literal word "product" is found in the first
+segment of the URL, and a number is found in the second segment, the
+"catalog" class and the "product_lookup" method are instead used.
+
+You can match literal values or you can use two wildcard types:
+
+**(:num)** will match a segment containing only numbers.
+ **(:any)** will match a segment containing any character.
+
+.. note:: Routes will run in the order they are defined. Higher routes
+	will always take precedence over lower ones.
+
+Examples
+========
+
+Here are a few routing examples::
+
+	$route['journals'] = "blogs";
+
+A URL containing the word "journals" in the first segment will be
+remapped to the "blogs" class.
+
+::
+
+	$route['blog/joe'] = "blogs/users/34";
+
+A URL containing the segments blog/joe will be remapped to the "blogs"
+class and the "users" method. The ID will be set to "34".
+
+::
+
+	$route['product/(:any)'] = "catalog/product_lookup";
+
+A URL with "product" as the first segment, and anything in the second
+will be remapped to the "catalog" class and the "product_lookup"
+method.
+
+::
+
+	$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";
+
+A URL with "product" as the first segment, and a number in the second
+will be remapped to the "catalog" class and the
+"product_lookup_by_id" method passing in the match as a variable to
+the function.
+
+.. important:: Do not use leading/trailing slashes.
+
+Regular Expressions
+===================
+
+If you prefer you can use regular expressions to define your routing
+rules. Any valid regular expression is allowed, as are back-references.
+
+.. note:: If you use back-references you must use the dollar syntax
+	rather than the double backslash syntax.
+
+A typical RegEx route might look something like this::
+
+	$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
+
+In the above example, a URI similar to products/shirts/123 would instead
+call the shirts controller class and the id_123 function.
+
+You can also mix and match wildcards with regular expressions.
+
+Reserved Routes
+===============
+
+There are two reserved routes::
+
+	$route['default_controller'] = 'welcome';
+
+This route indicates which controller class should be loaded if the URI
+contains no data, which will be the case when people load your root URL.
+In the above example, the "welcome" class would be loaded. You are
+encouraged to always have a default route otherwise a 404 page will
+appear by default.
+
+::
+
+	$route['404_override'] = '';
+
+This route indicates which controller class should be loaded if the
+requested controller is not found. It will override the default 404
+error page. It won't affect to the show_404() function, which will
+continue loading the default error_404.php file at
+application/errors/error_404.php.
+
+.. important:: The reserved routes must come before any wildcard or
+	regular expression routes.
diff --git a/user_guide_src/source/general/security.rst b/user_guide_src/source/general/security.rst
new file mode 100644
index 0000000..d9d5b72
--- /dev/null
+++ b/user_guide_src/source/general/security.rst
@@ -0,0 +1,90 @@
+########
+Security
+########
+
+This page describes some "best practices" regarding web security, and
+details CodeIgniter's internal security features.
+
+URI Security
+============
+
+CodeIgniter is fairly restrictive regarding which characters it allows
+in your URI strings in order to help minimize the possibility that
+malicious data can be passed to your application. URIs may only contain
+the following:
+
+-  Alpha-numeric text
+-  Tilde: ~
+-  Period: .
+-  Colon: :
+-  Underscore: \_
+-  Dash: -
+
+Register_globals
+=================
+
+During system initialization all global variables are unset, except
+those found in the $_GET, $_POST, and $_COOKIE arrays. The unsetting
+routine is effectively the same as register_globals = off.
+
+error_reporting
+================
+
+In production environments, it is typically desirable to disable PHP's
+error reporting by setting the internal error_reporting flag to a value
+of 0. This disables native PHP errors from being rendered as output,
+which may potentially contain sensitive information.
+
+Setting CodeIgniter's ENVIRONMENT constant in index.php to a value of
+'production' will turn off these errors. In development mode, it is
+recommended that a value of 'development' is used. More information
+about differentiating between environments can be found on the :doc:`Handling
+Environments <environments>` page.
+
+magic_quotes_runtime
+======================
+
+The magic_quotes_runtime directive is turned off during system
+initialization so that you don't have to remove slashes when retrieving
+data from your database.
+
+**************
+Best Practices
+**************
+
+Before accepting any data into your application, whether it be POST data
+from a form submission, COOKIE data, URI data, XML-RPC data, or even
+data from the SERVER array, you are encouraged to practice this three
+step approach:
+
+#. Filter the data as if it were tainted.
+#. Validate the data to ensure it conforms to the correct type, length,
+   size, etc. (sometimes this step can replace step one)
+#. Escape the data before submitting it into your database.
+
+CodeIgniter provides the following functions to assist in this process:
+
+XSS Filtering
+=============
+
+CodeIgniter comes with a Cross Site Scripting filter. This filter
+looks for commonly used techniques to embed malicious Javascript into
+your data, or other types of code that attempt to hijack cookies or
+do other malicious things. The XSS Filter is described
+:doc:`here <../libraries/security>`.
+
+Validate the data
+=================
+
+CodeIgniter has a :doc:`Form Validation
+Class <../libraries/form_validation>` that assists you in
+validating, filtering, and prepping your data.
+
+Escape all data before database insertion
+=========================================
+
+Never insert information into your database without escaping it.
+Please see the section that discusses
+:doc:`queries <../database/queries>` for more information.
+
+
diff --git a/user_guide_src/source/general/styleguide.rst b/user_guide_src/source/general/styleguide.rst
new file mode 100644
index 0000000..fe7def1
--- /dev/null
+++ b/user_guide_src/source/general/styleguide.rst
@@ -0,0 +1,403 @@
+########################
+General Style and Syntax
+########################
+
+The following page describes the use of coding rules adhered to when
+developing CodeIgniter.
+
+.. contents:: Table of Contents
+
+File Format
+===========
+
+Files should be saved with Unicode (UTF-8) encoding. The BOM should
+*not* be used. Unlike UTF-16 and UTF-32, there's no byte order to
+indicate in a UTF-8 encoded file, and the BOM can have a negative side
+effect in PHP of sending output, preventing the application from being
+able to set its own headers. Unix line endings should be used (LF).
+
+Here is how to apply these settings in some of the more common text
+editors. Instructions for your text editor may vary; check your text
+editor's documentation.
+
+TextMate
+''''''''
+
+#. Open the Application Preferences
+#. Click Advanced, and then the "Saving" tab
+#. In "File Encoding", select "UTF-8 (recommended)"
+#. In "Line Endings", select "LF (recommended)"
+#. *Optional:* Check "Use for existing files as well" if you wish to
+   modify the line endings of files you open to your new preference.
+
+BBEdit
+''''''
+
+#. Open the Application Preferences
+#. Select "Text Encodings" on the left.
+#. In "Default text encoding for new documents", select "Unicode (UTF-8,
+   no BOM)"
+#. *Optional:* In "If file's encoding can't be guessed, use", select
+   "Unicode (UTF-8, no BOM)"
+#. Select "Text Files" on the left.
+#. In "Default line breaks", select "Mac OS X and Unix (LF)"
+
+PHP Closing Tag
+===============
+
+The PHP closing tag on a PHP document **?>** is optional to the PHP
+parser. However, if used, any whitespace following the closing tag,
+whether introduced by the developer, user, or an FTP application, can
+cause unwanted output, PHP errors, or if the latter are suppressed,
+blank pages. For this reason, all PHP files should **OMIT** the closing
+PHP tag, and instead use a comment block to mark the end of file and
+it's location relative to the application root. This allows you to still
+identify a file as being complete and not truncated.
+
+::
+
+	INCORRECT: <?php  echo "Here's my code!";  ?>  CORRECT: <?php  echo "Here's my code!";  /* End of file myfile.php */ /* Location: ./system/modules/mymodule/myfile.php */
+
+Class and Method Naming
+=======================
+
+Class names should always start with an uppercase letter. Multiple words
+should be separated with an underscore, and not CamelCased. All other
+class methods should be entirely lowercased and named to clearly
+indicate their function, preferably including a verb. Try to avoid
+overly long and verbose names.
+
+::
+
+	INCORRECT: class superclass class SuperClass  CORRECT: class Super_class
+
+::
+
+	class Super_class {      function __construct()     {      } }
+
+Examples of improper and proper method naming::
+
+	INCORRECT: function fileproperties()       // not descriptive and needs underscore separator function fileProperties()       // not descriptive and uses CamelCase function getfileproperties()        // Better!  But still missing underscore separator function getFileProperties()        // uses CamelCase function get_the_file_properties_from_the_file()    // wordy  CORRECT: function get_file_properties()  // descriptive, underscore separator, and all lowercase letters
+
+Variable Names
+==============
+
+The guidelines for variable naming is very similar to that used for
+class methods. Namely, variables should contain only lowercase letters,
+use underscore separators, and be reasonably named to indicate their
+purpose and contents. Very short, non-word variables should only be used
+as iterators in for() loops.
+
+::
+
+	INCORRECT: $j = 'foo';       // single letter variables should only be used in for() loops $Str            // contains uppercase letters $bufferedText       // uses CamelCasing, and could be shortened without losing semantic meaning $groupid        // multiple words, needs underscore separator $name_of_last_city_used // too long  CORRECT: for ($j = 0; $j < 10; $j++) $str $buffer $group_id $last_city
+
+Commenting
+==========
+
+In general, code should be commented prolifically. It not only helps
+describe the flow and intent of the code for less experienced
+programmers, but can prove invaluable when returning to your own code
+months down the line. There is not a required format for comments, but
+the following are recommended.
+
+`DocBlock <http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_phpDocumentor.howto.pkg.html#basics.docblock>`_
+style comments preceding class and method declarations so they can be
+picked up by IDEs::
+
+	/**  * Super Class  *  * @package Package Name  * @subpackage  Subpackage  * @category    Category  * @author  Author Name  * @link    http://example.com  */ class Super_class {
+
+::
+
+	/**  * Encodes string for use in XML  *  * @access  public  * @param   string  * @return  string  */ function xml_encode($str)
+
+Use single line comments within code, leaving a blank line between large
+comment blocks and code.
+
+::
+
+	// break up the string by newlines $parts = explode("\n", $str);  // A longer comment that needs to give greater detail on what is // occurring and why can use multiple single-line comments.  Try to // keep the width reasonable, around 70 characters is the easiest to // read.  Don't hesitate to link to permanent external resources // that may provide greater detail: // // http://example.com/information_about_something/in_particular/  $parts = $this->foo($parts);
+
+Constants
+=========
+
+Constants follow the same guidelines as do variables, except constants
+should always be fully uppercase. *Always use CodeIgniter constants when
+appropriate, i.e. SLASH, LD, RD, PATH_CACHE, etc.*
+
+::
+
+	INCORRECT: myConstant  // missing underscore separator and not fully uppercase N       // no single-letter constants S_C_VER     // not descriptive $str = str_replace('{foo}', 'bar', $str);   // should use LD and RD constants  CORRECT: MY_CONSTANT NEWLINE SUPER_CLASS_VERSION $str = str_replace(LD.'foo'.RD, 'bar', $str);
+
+TRUE, FALSE, and NULL
+=====================
+
+**TRUE**, **FALSE**, and **NULL** keywords should always be fully
+uppercase.
+
+::
+
+	INCORRECT: if ($foo == true) $bar = false; function foo($bar = null)  CORRECT: if ($foo == TRUE) $bar = FALSE; function foo($bar = NULL)
+
+Logical Operators
+=================
+
+Use of **\|\|** is discouraged as its clarity on some output devices is
+low (looking like the number 11 for instance). **&&** is preferred over
+**AND** but either are acceptable, and a space should always precede and
+follow **!**.
+
+::
+
+	INCORRECT: if ($foo || $bar) if ($foo AND $bar)  // okay but not recommended for common syntax highlighting applications if (!$foo) if (! is_array($foo))  CORRECT: if ($foo OR $bar) if ($foo && $bar) // recommended if ( ! $foo) if ( ! is_array($foo))
+
+Comparing Return Values and Typecasting
+=======================================
+
+Some PHP functions return FALSE on failure, but may also have a valid
+return value of "" or 0, which would evaluate to FALSE in loose
+comparisons. Be explicit by comparing the variable type when using these
+return values in conditionals to ensure the return value is indeed what
+you expect, and not a value that has an equivalent loose-type
+evaluation.
+
+Use the same stringency in returning and checking your own variables.
+Use **===** and **!==** as necessary.
+::
+
+	INCORRECT: // If 'foo' is at the beginning of the string, strpos will return a 0, // resulting in this conditional evaluating as TRUE if (strpos($str, 'foo') == FALSE)  CORRECT: if (strpos($str, 'foo') === FALSE)
+
+::
+
+	INCORRECT: function build_string($str = "") {     if ($str == "") // uh-oh!  What if FALSE or the integer 0 is passed as an argument?     {      } }  CORRECT: function build_string($str = "") {     if ($str === "")     {      } }
+
+
+See also information regarding
+`typecasting <http://us3.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting>`_,
+which can be quite useful. Typecasting has a slightly different effect
+which may be desirable. When casting a variable as a string, for
+instance, NULL and boolean FALSE variables become empty strings, 0 (and
+other numbers) become strings of digits, and boolean TRUE becomes "1"::
+
+	$str = (string) $str; // cast $str as a string
+
+Debugging Code
+==============
+
+No debugging code can be left in place for submitted add-ons unless it
+is commented out, i.e. no var_dump(), print_r(), die(), and exit()
+calls that were used while creating the add-on, unless they are
+commented out.
+
+::
+
+	// print_r($foo);
+
+Whitespace in Files
+===================
+
+No whitespace can precede the opening PHP tag or follow the closing PHP
+tag. Output is buffered, so whitespace in your files can cause output to
+begin before CodeIgniter outputs its content, leading to errors and an
+inability for CodeIgniter to send proper headers. In the examples below,
+select the text with your mouse to reveal the incorrect whitespace.
+
+**INCORRECT**::
+
+	 <?php     // ...there is whitespace and a linebreak above the opening PHP tag     // as well as whitespace after the closing PHP tag ?>
+
+**CORRECT**::
+
+	<?php     // this sample has no whitespace before or after the opening and closing PHP tags ?>
+
+Compatibility
+=============
+
+Unless specifically mentioned in your add-on's documentation, all code
+must be compatible with PHP version 5.1+. Additionally, do not use PHP
+functions that require non-default libraries to be installed unless your
+code contains an alternative method when the function is not available,
+or you implicitly document that your add-on requires said PHP libraries.
+
+Class and File Names using Common Words
+=======================================
+
+When your class or filename is a common word, or might quite likely be
+identically named in another PHP script, provide a unique prefix to help
+prevent collision. Always realize that your end users may be running
+other add-ons or third party PHP scripts. Choose a prefix that is unique
+to your identity as a developer or company.
+
+::
+
+	INCORRECT: class Email     pi.email.php class Xml       ext.xml.php class Import        mod.import.php  CORRECT: class Pre_email     pi.pre_email.php class Pre_xml       ext.pre_xml.php class Pre_import    mod.pre_import.php
+
+Database Table Names
+====================
+
+Any tables that your add-on might use must use the 'exp\_' prefix,
+followed by a prefix uniquely identifying you as the developer or
+company, and then a short descriptive table name. You do not need to be
+concerned about the database prefix being used on the user's
+installation, as CodeIgniter's database class will automatically convert
+'exp\_' to what is actually being used.
+
+::
+
+	INCORRECT: email_addresses     // missing both prefixes pre_email_addresses // missing exp_ prefix exp_email_addresses // missing unique prefix  CORRECT: exp_pre_email_addresses
+
+**NOTE:** Be mindful that MySQL has a limit of 64 characters for table
+names. This should not be an issue as table names that would exceed this
+would likely have unreasonable names. For instance, the following table
+name exceeds this limitation by one character. Silly, no?
+**exp_pre_email_addresses_of_registered_users_in_seattle_washington**
+One File per Class
+==================
+
+Use separate files for each class your add-on uses, unless the classes
+are *closely related*. An example of CodeIgniter files that contains
+multiple classes is the Database class file, which contains both the DB
+class and the DB_Cache class, and the Magpie plugin, which contains
+both the Magpie and Snoopy classes.
+
+Whitespace
+==========
+
+Use tabs for whitespace in your code, not spaces. This may seem like a
+small thing, but using tabs instead of whitespace allows the developer
+looking at your code to have indentation at levels that they prefer and
+customize in whatever application they use. And as a side benefit, it
+results in (slightly) more compact files, storing one tab character
+versus, say, four space characters.
+
+Line Breaks
+===========
+
+Files must be saved with Unix line breaks. This is more of an issue for
+developers who work in Windows, but in any case ensure that your text
+editor is setup to save files with Unix line breaks.
+
+Code Indenting
+==============
+
+Use Allman style indenting. With the exception of Class declarations,
+braces are always placed on a line by themselves, and indented at the
+same level as the control statement that "owns" them.
+
+::
+
+	INCORRECT: function foo($bar) {     // ... }  foreach ($arr as $key => $val) {     // ... }  if ($foo == $bar) {     // ... } else {     // ... }  for ($i = 0; $i < 10; $i++)     {     for ($j = 0; $j < 10; $j++)         {         // ...         }     }  CORRECT: function foo($bar) {     // ... }  foreach ($arr as $key => $val) {     // ... }  if ($foo == $bar) {     // ... } else {     // ... }  for ($i = 0; $i < 10; $i++) {     for ($j = 0; $j < 10; $j++)     {         // ...     } }
+
+Bracket and Parenthetic Spacing
+===============================
+
+In general, parenthesis and brackets should not use any additional
+spaces. The exception is that a space should always follow PHP control
+structures that accept arguments with parenthesis (declare, do-while,
+elseif, for, foreach, if, switch, while), to help distinguish them from
+functions and increase readability.
+
+::
+
+	INCORRECT: $arr[ $foo ] = 'foo';  CORRECT: $arr[$foo] = 'foo'; // no spaces around array keys   INCORRECT: function foo ( $bar ) {  }  CORRECT: function foo($bar) // no spaces around parenthesis in function declarations {  }   INCORRECT: foreach( $query->result() as $row )  CORRECT: foreach ($query->result() as $row) // single space following PHP control structures, but not in interior parenthesis
+
+Localized Text
+==============
+
+Any text that is output in the control panel should use language
+variables in your lang file to allow localization.
+
+::
+
+	INCORRECT: return "Invalid Selection";  CORRECT: return $this->lang->line('invalid_selection');
+
+Private Methods and Variables
+=============================
+
+Methods and variables that are only accessed internally by your class,
+such as utility and helper functions that your public methods use for
+code abstraction, should be prefixed with an underscore.
+
+::
+
+	convert_text()        // public method _convert_text()     // private method
+
+PHP Errors
+==========
+
+Code must run error free and not rely on warnings and notices to be
+hidden to meet this requirement. For instance, never access a variable
+that you did not set yourself (such as $_POST array keys) without first
+checking to see that it isset().
+
+Make sure that while developing your add-on, error reporting is enabled
+for ALL users, and that display_errors is enabled in the PHP
+environment. You can check this setting with::
+
+	if (ini_get('display_errors') == 1) {     exit "Enabled"; }
+
+On some servers where display_errors is disabled, and you do not have
+the ability to change this in the php.ini, you can often enable it with::
+
+	ini_set('display_errors', 1);
+
+**NOTE:** Setting the
+`display_errors <http://us.php.net/manual/en/ref.errorfunc.php#ini.display-errors>`_
+setting with ini_set() at runtime is not identical to having it enabled
+in the PHP environment. Namely, it will not have any effect if the
+script has fatal errors
+
+Short Open Tags
+===============
+
+Always use full PHP opening tags, in case a server does not have
+short_open_tag enabled.
+
+::
+
+	INCORRECT: <? echo $foo; ?>  <?=$foo?>  CORRECT: <?php echo $foo; ?>
+
+One Statement Per Line
+======================
+
+Never combine statements on one line.
+
+::
+
+	INCORRECT: $foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);  CORRECT: $foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);
+
+Strings
+=======
+
+Always use single quoted strings unless you need variables parsed, and
+in cases where you do need variables parsed, use braces to prevent
+greedy token parsing. You may also use double-quoted strings if the
+string contains single quotes, so you do not have to use escape
+characters.
+
+::
+
+	INCORRECT: "My String"                 // no variable parsing, so no use for double quotes "My string $foo"                // needs braces 'SELECT foo FROM bar WHERE baz = \'bag\''   // ugly  CORRECT: 'My String' "My string {$foo}" "SELECT foo FROM bar WHERE baz = 'bag'"
+
+SQL Queries
+===========
+
+MySQL keywords are always capitalized: SELECT, INSERT, UPDATE, WHERE,
+AS, JOIN, ON, IN, etc.
+
+Break up long queries into multiple lines for legibility, preferably
+breaking for each clause.
+
+::
+
+	INCORRECT: // keywords are lowercase and query is too long for // a single line (... indicates continuation of line) $query = $this->db->query("select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses ...where foo != 'oof' and baz != 'zab' order by foobaz limit 5, 100");  CORRECT: $query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz                 FROM exp_pre_email_addresses                 WHERE foo != 'oof'                 AND baz != 'zab'                 ORDER BY foobaz                 LIMIT 5, 100");
+
+Default Function Arguments
+==========================
+
+Whenever appropriate, provide function argument defaults, which helps
+prevent PHP errors with mistaken calls and provides common fallback
+values which can save a few lines of code. Example::
+
+	function foo($bar = '', $baz = FALSE)
+
diff --git a/user_guide_src/source/general/urls.rst b/user_guide_src/source/general/urls.rst
new file mode 100644
index 0000000..296271e
--- /dev/null
+++ b/user_guide_src/source/general/urls.rst
@@ -0,0 +1,88 @@
+################
+CodeIgniter URLs
+################
+
+By default, URLs in CodeIgniter are designed to be search-engine and
+human friendly. Rather than using the standard "query string" approach
+to URLs that is synonymous with dynamic systems, CodeIgniter uses a
+**segment-based** approach::
+
+	example.com/news/article/my_article
+
+.. note:: Query string URLs can be optionally enabled, as described
+	below.
+
+URI Segments
+============
+
+The segments in the URL, in following with the Model-View-Controller
+approach, usually represent::
+
+	example.com/class/function/ID
+
+
+#. The first segment represents the controller **class** that should be
+   invoked.
+#. The second segment represents the class **function**, or method, that
+   should be called.
+#. The third, and any additional segments, represent the ID and any
+   variables that will be passed to the controller.
+
+The :doc::doc:`URI Class <../libraries/uri>` and the `URL
+Helper <../helpers/url_helper>` contain functions that make it
+easy to work with your URI data. In addition, your URLs can be remapped
+using the :doc:`URI Routing <routing>` feature for more flexibility.
+
+Removing the index.php file
+===========================
+
+By default, the **index.php** file will be included in your URLs::
+
+	example.com/index.php/news/article/my_article
+
+You can easily remove this file by using a .htaccess file with some
+simple rules. Here is an example of such a file, using the "negative"
+method in which everything is redirected except the specified items::
+
+	RewriteEngine on RewriteCond $1 !^(index\.php|images|robots\.txt) RewriteRule ^(.*)$ /index.php/$1 [L]
+
+In the above example, any HTTP request other than those for index.php,
+images, and robots.txt is treated as a request for your index.php file.
+
+Adding a URL Suffix
+===================
+
+In your config/config.php file you can specify a suffix that will be
+added to all URLs generated by CodeIgniter. For example, if a URL is
+this::
+
+	example.com/index.php/products/view/shoes
+
+You can optionally add a suffix, like .html, making the page appear to
+be of a certain type::
+
+	example.com/index.php/products/view/shoes.html
+
+Enabling Query Strings
+======================
+
+In some cases you might prefer to use query strings URLs::
+
+	index.php?c=products&m=view&id=345
+
+CodeIgniter optionally supports this capability, which can be enabled in
+your application/config.php file. If you open your config file you'll
+see these items::
+
+	$config['enable_query_strings'] = FALSE; $config['controller_trigger'] = 'c'; $config['function_trigger'] = 'm';
+
+If you change "enable_query_strings" to TRUE this feature will become
+active. Your controllers and functions will then be accessible using the
+"trigger" words you've set to invoke your controllers and methods::
+
+	index.php?c=controller&m=method
+
+**Please note:** If you are using query strings you will have to build
+your own URLs, rather than utilizing the URL helpers (and other helpers
+that generate URLs, like some of the form helpers) as these are designed
+to work with segment based URLs.
diff --git a/user_guide_src/source/general/views.rst b/user_guide_src/source/general/views.rst
new file mode 100644
index 0000000..cb60ce2
--- /dev/null
+++ b/user_guide_src/source/general/views.rst
@@ -0,0 +1,138 @@
+#####
+Views
+#####
+
+A view is simply a web page, or a page fragment, like a header, footer,
+sidebar, etc. In fact, views can flexibly be embedded within other views
+(within other views, etc., etc.) if you need this type of hierarchy.
+
+Views are never called directly, they must be loaded by a
+:doc:`controller <controllers>`. Remember that in an MVC framework, the
+Controller acts as the traffic cop, so it is responsible for fetching a
+particular view. If you have not read the
+:doc:`Controllers <controllers>` page you should do so before
+continuing.
+
+Using the example controller you created in the
+:doc:`controller <controllers>` page, let's add a view to it.
+
+Creating a View
+===============
+
+Using your text editor, create a file called blogview.php, and put this
+in it:
+
+<html> <head> <title>My Blog</title> </head> <body> <h1>Welcome to my
+Blog!</h1> </body> </html>
+Then save the file in your application/views/ folder.
+
+Loading a View
+==============
+
+To load a particular view file you will use the following function::
+
+	$this->load->view('name');
+
+Where name is the name of your view file. Note: The .php file extension
+does not need to be specified unless you use something other than .php.
+
+Now, open the controller file you made earlier called blog.php, and
+replace the echo statement with the view loading function:
+
+<?php class Blog extends CI_Controller { function index() {
+$this->load->view('blogview'); } } ?>
+If you visit your site using the URL you did earlier you should see your
+new view. The URL was similar to this::
+
+	example.com/index.php/blog/
+
+Loading multiple views
+======================
+
+CodeIgniter will intelligently handle multiple calls to
+$this->load->view from within a controller. If more than one call
+happens they will be appended together. For example, you may wish to
+have a header view, a menu view, a content view, and a footer view. That
+might look something like this::
+
+	<?php  class Page extends CI_Controller {      function index()    {       $data['page_title'] =  'Your title';       $this->load->view('header');       $this->load->view('menu');       $this->load->view('content', $data);       $this->load->view('footer');    }  }     ?>
+
+
+In the example above, we are using "dynamically added data", which you
+will see below.
+
+Storing Views within Sub-folders
+================================
+
+Your view files can also be stored within sub-folders if you prefer that
+type of organization. When doing so you will need to include the folder
+name loading the view. Example::
+
+	$this->load->view('folder_name/file_name');
+
+Adding Dynamic Data to the View
+===============================
+
+Data is passed from the controller to the view by way of an **array** or
+an **object** in the second parameter of the view loading function. Here
+is an example using an array::
+
+	$data = array(                'title' => 'My Title',                'heading' => 'My Heading',                'message' => 'My Message'           );  $this->load->view('blogview', $data);
+
+And here's an example using an object::
+
+	$data = new Someclass(); $this->load->view('blogview', $data);
+
+Note: If you use an object, the class variables will be turned into
+array elements.
+
+Let's try it with your controller file. Open it add this code:
+
+<?php class Blog extends CI_Controller { function index() {
+$data['title'] = "My Real Title"; $data['heading'] = "My Real Heading";
+$this->load->view('blogview', $data); } } ?>
+Now open your view file and change the text to variables that correspond
+to the array keys in your data:
+
+<html> <head> <title><?php echo $title;?></title> </head> <body>
+<h1><?php echo $heading;?></h1> </body> </html>
+Then load the page at the URL you've been using and you should see the
+variables replaced.
+
+Creating Loops
+==============
+
+The data array you pass to your view files is not limited to simple
+variables. You can pass multi dimensional arrays, which can be looped to
+generate multiple rows. For example, if you pull data from your database
+it will typically be in the form of a multi-dimensional array.
+
+Here's a simple example. Add this to your controller:
+
+<?php class Blog extends CI_Controller { function index() {
+$data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');
+$data['title'] = "My Real Title"; $data['heading'] = "My Real Heading";
+$this->load->view('blogview', $data); } } ?>
+Now open your view file and create a loop:
+
+<html> <head> <title><?php echo $title;?></title> </head> <body>
+<h1><?php echo $heading;?></h1> <h3>My Todo List</h3> <ul> <?php foreach
+($todo_list as $item):?> <li><?php echo $item;?></li> <?php
+endforeach;?> </ul> </body> </html>
+
+.. note:: You'll notice that in the example above we are using PHP's
+	alternative syntax. If you are not familiar with it you can read about
+	it `here </general/alternative_php>`.
+
+Returning views as data
+=======================
+
+There is a third **optional** parameter lets you change the behavior of
+the function so that it returns data as a string rather than sending it
+to your browser. This can be useful if you want to process the data in
+some way. If you set the parameter to true (boolean) it will return
+data. The default behavior is false, which sends it to your browser.
+Remember to assign it to a variable if you want the data returned::
+
+	$string = $this->load->view('myfile', '', true);
+
diff --git a/user_guide_src/source/helpers/array_helper.rst b/user_guide_src/source/helpers/array_helper.rst
new file mode 100644
index 0000000..4308753
--- /dev/null
+++ b/user_guide_src/source/helpers/array_helper.rst
@@ -0,0 +1,139 @@
+############
+Array Helper
+############
+
+The Array Helper file contains functions that assist in working with
+arrays.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('array');
+
+The following functions are available:
+
+element()
+=========
+
+.. php:method:: element($item, $array, $default = FALSE)
+
+	:param string 	$item: Item to fetch from the array
+	:param array 	$array: Input array
+	:param boolean	$default: What to return if the array isn't valid
+	:returns: FALSE on failure or the array item.
+
+
+Lets you fetch an item from an array. The function tests whether the
+array index is set and whether it has a value. If a value exists it is
+returned. If a value does not exist it returns FALSE, or whatever you've
+specified as the default value via the third parameter. Example
+
+::
+
+	$array = array(
+		'color'	=> 'red',
+		'shape'	=> 'round',
+		'size'	=> ''
+	);
+
+	echo element('color', $array); // returns "red" 
+	echo element('size', $array, NULL); // returns NULL 
+
+elements()
+==========
+
+Lets you fetch a number of items from an array. The function tests
+whether each of the array indices is set. If an index does not exist it
+is set to FALSE, or whatever you've specified as the default value via
+the third parameter. 
+
+.. php:method:: elements($items, $array, $default = FALSE)
+
+	:param string 	$item: Item to fetch from the array
+	:param array 	$array: Input array
+	:param boolean	$default: What to return if the array isn't valid
+	:returns: FALSE on failure or the array item.
+
+Example
+
+::
+
+	$array = array(
+		'color' => 'red',  
+		'shape' => 'round',     
+		'radius' => '10',     
+		'diameter' => '20'
+	);
+
+	$my_shape = elements(array('color', 'shape', 'height'), $array);
+
+The above will return the following array
+
+::
+
+	array(
+		'color' => 'red',     
+		'shape' => 'round',     
+		'height' => FALSE
+	);
+
+You can set the third parameter to any default value you like
+
+::
+
+	 $my_shape = elements(array('color', 'shape', 'height'), $array, NULL);
+
+The above will return the following array
+
+::
+
+	array(     
+		'color' 	=> 'red',     
+		'shape' 	=> 'round',     
+		'height'	=> NULL
+	);
+
+This is useful when sending the $_POST array to one of your Models.
+This prevents users from sending additional POST data to be entered into
+your tables
+
+::
+
+	$this->load->model('post_model');
+	$this->post_model->update(
+		elements(array('id', 'title', 'content'), $_POST)
+	);
+
+This ensures that only the id, title and content fields are sent to be
+updated.
+
+random_element()
+================
+
+Takes an array as input and returns a random element from it. Usage
+example
+
+.. php:method:: random_element($array)
+
+	:param array 	$array: Input array
+	:returns: String - Random element from the array.
+
+::
+
+	$quotes = array(
+		"I find that the harder I work, the more luck I seem to have. - Thomas Jefferson",
+		"Don't stay in bed, unless you can make money in bed. - George Burns",
+		"We didn't lose the game; we just ran out of time. - Vince Lombardi",
+		"If everything seems under control, you're not going fast enough. - Mario Andretti",
+		"Reality is merely an illusion, albeit a very persistent one. - Albert Einstein",
+		"Chance favors the prepared mind - Louis Pasteur"
+	);
+
+	echo random_element($quotes);
+
diff --git a/user_guide_src/source/helpers/captcha_helper.rst b/user_guide_src/source/helpers/captcha_helper.rst
new file mode 100644
index 0000000..48095a1
--- /dev/null
+++ b/user_guide_src/source/helpers/captcha_helper.rst
@@ -0,0 +1,156 @@
+##############
+CAPTCHA Helper
+##############
+
+The CAPTCHA Helper file contains functions that assist in creating
+CAPTCHA images.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('captcha');
+
+The following functions are available:
+
+create_captcha($data)
+=====================
+
+Takes an array of information to generate the CAPTCHA as input and
+creates the image to your specifications, returning an array of
+associative data about the image.
+
+.. php:method:: function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '')
+
+	:param array 	$data: array of data for the CAPTCHA
+	:param string 	$img_path: path to create the image in
+	:param string	$img_url: URL to the CAPTCHA image folder
+	:param string	$font_path: server path to font
+	:returns: array('word' => $word, 'time' => $now, 'image' => $img)
+
+
+::
+
+	[array] (
+		'image' => IMAGE TAG   
+		'time'  => TIMESTAMP (in microtime)   
+		'word'  => CAPTCHA WORD )
+
+The "image" is the actual image tag:
+
+::
+
+	<img src="http://example.com/captcha/12345.jpg" width="140" height="50" />
+
+
+The "time" is the micro timestamp used as the image name without the
+file extension. It will be a number like this: 1139612155.3422
+
+The "word" is the word that appears in the captcha image, which if not
+supplied to the function, will be a random string.
+
+Using the CAPTCHA helper
+------------------------
+
+Once loaded you can generate a captcha like this
+
+::
+
+	$vals = array(     
+		'word'       => 'Random word',     
+		'img_path'   => './captcha/',     
+		'img_url'    => 'http://example.com/captcha/',     
+		'font_path'  => './path/to/fonts/texb.ttf',     
+		'img_width'  => '150',     
+		'img_height' => 30,     
+		'expiration' => 7200     
+	);
+
+	$cap = create_captcha($vals); echo $cap['image'];
+
+
+-  The captcha function requires the GD image library.
+-  Only the img_path and img_url are required.
+-  If a "word" is not supplied, the function will generate a random
+   ASCII string. You might put together your own word library that you
+   can draw randomly from.
+-  If you do not specify a path to a TRUE TYPE font, the native ugly GD
+   font will be used.
+-  The "captcha" folder must be writable (666, or 777)
+-  The "expiration" (in seconds) signifies how long an image will remain
+   in the captcha folder before it will be deleted. The default is two
+   hours.
+
+Adding a Database
+-----------------
+
+In order for the captcha function to prevent someone from submitting,
+you will need to add the information returned from create_captcha()
+function to your database. Then, when the data from the form is
+submitted by the user you will need to verify that the data exists in
+the database and has not expired.
+
+Here is a table prototype
+
+::
+
+	CREATE TABLE captcha (  
+		captcha_id bigint(13) unsigned NOT NULL auto_increment,  
+		captcha_time int(10) unsigned NOT NULL,  
+		ip_address varchar(16) default '0' NOT NULL,  
+		word varchar(20) NOT NULL,  
+		PRIMARY KEY `captcha_id` (`captcha_id`),  
+		KEY `word` (`word`)
+	);
+
+Here is an example of usage with a database. On the page where the
+CAPTCHA will be shown you'll have something like this
+
+::
+
+	$this->load->helper('captcha');
+	$vals = array(     
+		'img_path'	=> './captcha/',     
+		'img_url'	=> 'http://example.com/captcha/'     
+	);
+
+	$cap = create_captcha($vals);
+	$data = array(     
+		'captcha_time'	=> $cap['time'],     
+		'ip_address'	=> $this->input->ip_address(),     
+		'word'		=> $cap['word']     
+	);
+
+	$query = $this->db->insert_string('captcha', $data);
+	$this->db->query($query);
+
+	echo 'Submit the word you see below:';
+	echo $cap['image']; 
+	echo '<input type="text" name="captcha" value="" />';
+
+Then, on the page that accepts the submission you'll have something like
+this
+
+::
+
+	// First, delete old captchas
+	$expiration = time() - 7200; // Two hour limit
+	$this->db->where('captcha_time < ', $expiration)
+		 ->delete('captcha');
+
+	// Then see if a captcha exists:
+	$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?";
+	$binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
+	$query = $this->db->query($sql, $binds);
+	$row = $query->row();
+
+	if ($row->count == 0)
+	{     
+		echo "You must submit the word that appears in the image";
+	}
+
diff --git a/user_guide_src/source/helpers/cookie_helper.rst b/user_guide_src/source/helpers/cookie_helper.rst
new file mode 100644
index 0000000..30e601c
--- /dev/null
+++ b/user_guide_src/source/helpers/cookie_helper.rst
@@ -0,0 +1,78 @@
+#############
+Cookie Helper
+#############
+
+The Cookie Helper file contains functions that assist in working with
+cookies.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('cookie');
+
+The following functions are available:
+
+set_cookie()
+============
+
+This helper function gives you view file friendly syntax to set browser
+cookies. Refer to the :doc:`Input class <../libraries/input>` for a
+description of use, as this function is an alias to
+`$this->input->set_cookie()`.
+
+.. php:method:: set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE)
+
+	:param string 	$name: the name of the cookie
+	:param string 	$value: the value of the cookie
+	:param string 	$expire: the number of seconds until expiration
+	:param string 	$domain: the cookie domain.  Usually:  .yourdomain.com
+	:param string 	$path: the cookie path
+	:param string 	$prefix: the cookie prefix
+	:param boolean	$secure: secure cookie or not.
+	:returns: void
+
+get_cookie()
+============
+
+This helper function gives you view file friendly syntax to get browser
+cookies. Refer to the :doc:`Input class <../libraries/input>` for a
+description of use, as this function is an alias to `$this->input->cookie()`.
+
+.. php:method:: get_cookie($index = '', $xss_clean = FALSE)
+
+	:param string 	$index: the name of the cookie
+	:param boolean	$xss_clean: If the resulting value should be xss_cleaned or not
+	:returns: mixed
+
+delete_cookie()
+===============
+
+Lets you delete a cookie. Unless you've set a custom path or other
+values, only the name of the cookie is needed
+
+.. php:method:: delete_cookie($name = '', $domain = '', $path = '/', $prefix = '')
+
+	:param string 	$name: the name of the cookie
+	:param string 	$domain: cookie domain (ususally .example.com)
+	:param string 	$path: cookie path
+	:param string 	$prefix: cookie prefix
+	:returns: void
+
+::
+
+	delete_cookie("name");
+
+This function is otherwise identical to ``set_cookie()``, except that it
+does not have the value and expiration parameters. You can submit an
+array of values in the first parameter or you can set discrete
+parameters.
+
+::
+
+	delete_cookie($name, $domain, $path, $prefix)
\ No newline at end of file
diff --git a/user_guide_src/source/helpers/date_helper.rst b/user_guide_src/source/helpers/date_helper.rst
new file mode 100644
index 0000000..378ff36
--- /dev/null
+++ b/user_guide_src/source/helpers/date_helper.rst
@@ -0,0 +1,457 @@
+###########
+Date Helper
+###########
+
+The Date Helper file contains functions that help you work with dates.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('date');
+
+The following functions are available:
+
+now()
+=====
+
+Returns the current time as a Unix timestamp, referenced either to your
+server's local time or GMT, based on the "time reference" setting in
+your config file. If you do not intend to set your master time reference
+to GMT (which you'll typically do if you run a site that lets each user
+set their own timezone settings) there is no benefit to using this
+function over PHP's time() function.
+
+.. php:method:: now()
+
+mdate()
+=======
+
+This function is identical to PHPs `date() <http://www.php.net/date>`_
+function, except that it lets you use MySQL style date codes, where each
+code letter is preceded with a percent sign: %Y %m %d etc.
+
+The benefit of doing dates this way is that you don't have to worry
+about escaping any characters that are not date codes, as you would
+normally have to do with the date() function. Example
+
+.. php:method:: mdate($datestr = '', $time = '')
+
+	:param string 	$datestr: Date String
+	:param integer 	$time: time
+	:returns: integer
+
+
+::
+
+	$datestring = "Year: %Y Month: %m Day: %d - %h:%i %a";
+	$time = time();
+	echo mdate($datestring, $time);
+
+If a timestamp is not included in the second parameter the current time
+will be used.
+
+standard_date()
+===============
+
+Lets you generate a date string in one of several standardized formats.
+Example
+
+.. php:method:: standard_date($fmt = 'DATE_RFC822', $time = '')
+
+	:param string 	$fmt: the chosen format
+	:param string 	$time: Unix timestamp
+	:returns: string
+
+::
+
+	$format = 'DATE_RFC822';
+	$time = time();
+	echo standard_date($format, $time);
+
+The first parameter must contain the format, the second parameter must
+contain the date as a Unix timestamp.
+
+Supported formats:
+
++----------------+------------------------+-----------------------------------+
+| Constant       | Description            | Example                           |
++================+========================+===================================+
+| DATE_ATOM      | Atom                   | 2005-08-15T16:13:03+0000          |
++----------------+------------------------+-----------------------------------+
+| DATE_COOKIE    | HTTP Cookies           | Sun, 14 Aug 2005 16:13:03 UTC     |
++----------------+------------------------+-----------------------------------+
+| DATE_ISO8601   | ISO-8601               | 2005-08-14T16:13:03+00:00         |
++----------------+------------------------+-----------------------------------+
+| DATE_RFC822    | RFC 822                | Sun, 14 Aug 05 16:13:03 UTC       |
++----------------+------------------------+-----------------------------------+
+| DATE_RFC850    | RFC 850                | Sunday, 14-Aug-05 16:13:03 UTC    |
++----------------+------------------------+-----------------------------------+
+| DATE_RFC1036   | RFC 1036               | Sunday, 14-Aug-05 16:13:03 UTC    |
++----------------+------------------------+-----------------------------------+
+| DATE_RFC1123   | RFC 1123               | Sun, 14 Aug 2005 16:13:03 UTC     |
++----------------+------------------------+-----------------------------------+
+| DATE_RFC2822   | RFC 2822               | Sun, 14 Aug 2005 16:13:03 +0000   |
++----------------+------------------------+-----------------------------------+
+| DATE_RSS       | RSS                    | Sun, 14 Aug 2005 16:13:03 UTC     |
++----------------+------------------------+-----------------------------------+
+| DATE_W3C       | W3C                    | 2005-08-14T16:13:03+0000          |
++----------------+------------------------+-----------------------------------+
+
+
+local_to_gmt()
+==============
+
+Takes a Unix timestamp as input and returns it as GMT. 
+
+.. php:method:: local_to_gmt($time = '')
+
+	:param integer 	$time: Unix timestamp
+	:returns: string
+
+Example:
+
+::
+
+	$now = time();
+	$gmt = local_to_gmt($now);
+
+gmt_to_local()
+==============
+
+Takes a Unix timestamp (referenced to GMT) as input, and converts it to
+a localized timestamp based on the timezone and Daylight Saving time
+submitted.
+
+.. php:method:: gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE)
+
+	:param integer 	$time: Unix timestamp
+	:param string 	$timezone: timezone
+	:param boolean 	$dst: whether DST is active
+	:returns: integer
+
+Example
+
+::
+
+	$timestamp = '1140153693';
+	$timezone  = 'UM8';
+	$daylight_saving = TRUE;
+	echo gmt_to_local($timestamp, $timezone, $daylight_saving);
+
+
+.. note:: For a list of timezones see the reference at the bottom of this page.
+
+
+mysql_to_unix()
+===============
+
+Takes a MySQL Timestamp as input and returns it as Unix. 
+
+.. php:method:: mysql_to_unix($time = '')
+
+	:param integer 	$time: Unix timestamp
+	:returns: integer
+
+Example
+
+::
+
+	$mysql = '20061124092345';  $unix = mysql_to_unix($mysql);
+
+unix_to_human()
+===============
+
+Takes a Unix timestamp as input and returns it in a human readable
+format with this prototype
+
+.. php:method:: unix_to_human($time = '', $seconds = FALSE, $fmt = 'us')
+
+	:param integer 	$time: Unix timestamp
+	:param boolean 	$seconds: whether to show seconds
+	:param string 	$fmt: format: us or euro
+	:returns: integer
+
+Example
+
+::
+
+	YYYY-MM-DD HH:MM:SS AM/PM
+
+This can be useful if you need to display a date in a form field for
+submission.
+
+The time can be formatted with or without seconds, and it can be set to
+European or US format. If only the timestamp is submitted it will return
+the time without seconds formatted for the U.S. Examples
+
+::
+
+	$now = time();
+	echo unix_to_human($now); // U.S. time, no seconds
+	echo unix_to_human($now, TRUE, 'us'); // U.S. time with seconds
+	echo unix_to_human($now, TRUE, 'eu'); // Euro time with seconds
+
+human_to_unix()
+===============
+
+The opposite of the above function. Takes a "human" time as input and
+returns it as Unix. This function is useful if you accept "human"
+formatted dates submitted via a form. Returns FALSE (boolean) if the
+date string passed to it is not formatted as indicated above. 
+
+.. php:method:: human_to_unix($datestr = '')
+
+	:param integer 	$datestr: Date String
+	:returns: integer
+
+Example:
+
+::
+
+	$now = time();
+	$human = unix_to_human($now);
+	$unix = human_to_unix($human);
+
+nice_date()
+===========
+
+This function can take a number poorly-formed date formats and convert
+them into something useful. It also accepts well-formed dates.
+
+The function will return a Unix timestamp by default. You can,
+optionally, pass a format string (the same type as the PHP date function
+accepts) as the second parameter. 
+
+.. php:method:: nice_date($bad_date = '', $format = FALSE) 
+
+	:param integer 	$bad_date: The terribly formatted date-like string
+	:param string 	$format: Date format to return (same as php date function)
+	:returns: string
+
+Example
+
+::
+
+	$bad_time = 199605  // Should Produce: 1996-05-01
+	$better_time = nice_date($bad_time,'Y-m-d');
+	$bad_time = 9-11-2001 // Should Produce: 2001-09-11
+	$better_time = nice_date($human,'Y-m-d');
+
+timespan()
+==========
+
+Formats a unix timestamp so that is appears similar to this
+
+::
+
+	1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes
+
+The first parameter must contain a Unix timestamp. The second parameter
+must contain a timestamp that is greater that the first timestamp. If
+the second parameter empty, the current time will be used. The most
+common purpose for this function is to show how much time has elapsed
+from some point in time in the past to now. 
+
+.. php:method:: timespan($seconds = 1, $time = '')
+
+	:param integer 	$seconds: a number of seconds
+	:param string 	$time: Unix timestamp
+	:returns: string
+
+Example
+
+::
+
+	$post_date = '1079621429';
+	$now = time();
+	echo timespan($post_date, $now);
+
+.. note:: The text generated by this function is found in the following language
+	file: language/<your_lang>/date_lang.php
+
+days_in_month()
+===============
+
+Returns the number of days in a given month/year. Takes leap years into
+account. 
+
+.. php:method:: days_in_month($month = 0, $year = '')
+
+	:param integer 	$month: a numeric month
+	:param integer 	$year: a numeric year
+	:returns: integer
+
+Example
+
+::
+
+	echo days_in_month(06, 2005);
+
+If the second parameter is empty, the current year will be used.
+
+timezones()
+===========
+
+Takes a timezone reference (for a list of valid timezones, see the
+"Timezone Reference" below) and returns the number of hours offset from
+UTC.
+
+.. php:method:: timezones($tz = '')
+
+	:param string 	$tz: a numeric timezone
+	:returns: string
+
+Example
+
+::
+
+	echo timezones('UM5');
+
+
+This function is useful when used with `timezone_menu()`.
+
+timezone_menu()
+===============
+
+Generates a pull-down menu of timezones, like this one:
+
+
+.. raw:: html
+
+	<form action="#">
+		<select name="timezones">
+			<option value='UM12'>(UTC - 12:00) Enitwetok, Kwajalien</option>
+			<option value='UM11'>(UTC - 11:00) Nome, Midway Island, Samoa</option>
+			<option value='UM10'>(UTC - 10:00) Hawaii</option>
+			<option value='UM9'>(UTC - 9:00) Alaska</option>
+			<option value='UM8'>(UTC - 8:00) Pacific Time</option>
+			<option value='UM7'>(UTC - 7:00) Mountain Time</option>
+			<option value='UM6'>(UTC - 6:00) Central Time, Mexico City</option>
+			<option value='UM5'>(UTC - 5:00) Eastern Time, Bogota, Lima, Quito</option>
+			<option value='UM4'>(UTC - 4:00) Atlantic Time, Caracas, La Paz</option>
+			<option value='UM25'>(UTC - 3:30) Newfoundland</option>
+			<option value='UM3'>(UTC - 3:00) Brazil, Buenos Aires, Georgetown, Falkland Is.</option>
+			<option value='UM2'>(UTC - 2:00) Mid-Atlantic, Ascention Is., St Helena</option>
+			<option value='UM1'>(UTC - 1:00) Azores, Cape Verde Islands</option>
+			<option value='UTC' selected='selected'>(UTC) Casablanca, Dublin, Edinburgh, London, Lisbon, Monrovia</option>
+			<option value='UP1'>(UTC + 1:00) Berlin, Brussels, Copenhagen, Madrid, Paris, Rome</option>
+			<option value='UP2'>(UTC + 2:00) Kaliningrad, South Africa, Warsaw</option>
+			<option value='UP3'>(UTC + 3:00) Baghdad, Riyadh, Moscow, Nairobi</option>
+			<option value='UP25'>(UTC + 3:30) Tehran</option>
+			<option value='UP4'>(UTC + 4:00) Adu Dhabi, Baku, Muscat, Tbilisi</option>
+			<option value='UP35'>(UTC + 4:30) Kabul</option>
+			<option value='UP5'>(UTC + 5:00) Islamabad, Karachi, Tashkent</option>
+			<option value='UP45'>(UTC + 5:30) Bombay, Calcutta, Madras, New Delhi</option>
+			<option value='UP6'>(UTC + 6:00) Almaty, Colomba, Dhaka</option>
+			<option value='UP7'>(UTC + 7:00) Bangkok, Hanoi, Jakarta</option>
+			<option value='UP8'>(UTC + 8:00) Beijing, Hong Kong, Perth, Singapore, Taipei</option>
+			<option value='UP9'>(UTC + 9:00) Osaka, Sapporo, Seoul, Tokyo, Yakutsk</option>
+			<option value='UP85'>(UTC + 9:30) Adelaide, Darwin</option>
+			<option value='UP10'>(UTC + 10:00) Melbourne, Papua New Guinea, Sydney, Vladivostok</option>
+			<option value='UP11'>(UTC + 11:00) Magadan, New Caledonia, Solomon Islands</option>
+			<option value='UP12'>(UTC + 12:00) Auckland, Wellington, Fiji, Marshall Island</option>
+		</select>
+	</form>
+
+
+This menu is useful if you run a membership site in which your users are
+allowed to set their local timezone value.
+
+The first parameter lets you set the "selected" state of the menu. For
+example, to set Pacific time as the default you will do this
+
+.. php:method:: timezone_menu($default = 'UTC', $class = "", $name = 'timezones')
+
+	:param string 	$default: timezone
+	:param string	$class: classname
+	:param string	$name: menu name
+	:returns: string
+
+Example: 
+
+::
+
+	echo timezone_menu('UM8');
+
+Please see the timezone reference below to see the values of this menu.
+
+The second parameter lets you set a CSS class name for the menu.
+
+.. note:: The text contained in the menu is found in the following
+	language file: `language/<your_lang>/date_lang.php`
+
+
+Timezone Reference
+==================
+
+The following table indicates each timezone and its location.
+
++------------+----------------------------------------------------------------+
+| Time Zone  | Location                                                       |
++============+================================================================+
+| UM12       | (UTC - 12:00) Enitwetok, Kwajalien                             |
++------------+----------------------------------------------------------------+
+| UM11       | (UTC - 11:00) Nome, Midway Island, Samoa                       |
++------------+----------------------------------------------------------------+
+| UM10       | (UTC - 10:00) Hawaii                                           |
++------------+----------------------------------------------------------------+
+| UM9        | (UTC - 9:00) Alaska                                            |
++------------+----------------------------------------------------------------+
+| UM8        | (UTC - 8:00) Pacific Time                                      |
++------------+----------------------------------------------------------------+
+| UM7        | (UTC - 7:00) Mountain Time                                     |
++------------+----------------------------------------------------------------+
+| UM6        | (UTC - 6:00) Central Time, Mexico City                         |
++------------+----------------------------------------------------------------+
+| UM5        | (UTC - 5:00) Eastern Time, Bogota, Lima, Quito                 |
++------------+----------------------------------------------------------------+
+| UM4        | (UTC - 4:00) Atlantic Time, Caracas, La Paz                    |
++------------+----------------------------------------------------------------+
+| UM25       | (UTC - 3:30) Newfoundland                                      |
++------------+----------------------------------------------------------------+
+| UM3        | (UTC - 3:00) Brazil, Buenos Aires, Georgetown, Falkland Is.    |
++------------+----------------------------------------------------------------+
+| UM2        | (UTC - 2:00) Mid-Atlantic, Ascention Is., St Helena            |
++------------+----------------------------------------------------------------+
+| UM1        | (UTC - 1:00) Azores, Cape Verde Islands                        |
++------------+----------------------------------------------------------------+
+| UTC        | (UTC) Casablanca, Dublin, Edinburgh, London, Lisbon, Monrovia  |
++------------+----------------------------------------------------------------+
+| UP1        | (UTC + 1:00) Berlin, Brussels, Copenhagen, Madrid, Paris, Rome |
++------------+----------------------------------------------------------------+
+| UP2        | (UTC + 2:00) Kaliningrad, South Africa, Warsaw                 |
++------------+----------------------------------------------------------------+
+| UP3        | (UTC + 3:00) Baghdad, Riyadh, Moscow, Nairobi                  |
++------------+----------------------------------------------------------------+
+| UP25       | (UTC + 3:30) Tehran                                            |
++------------+----------------------------------------------------------------+
+| UP4        | (UTC + 4:00) Adu Dhabi, Baku, Muscat, Tbilisi                  |
++------------+----------------------------------------------------------------+
+| UP35       | (UTC + 4:30) Kabul                                             |
++------------+----------------------------------------------------------------+
+| UP5        | (UTC + 5:00) Islamabad, Karachi, Tashkent                      |
++------------+----------------------------------------------------------------+
+| UP45       | (UTC + 5:30) Bombay, Calcutta, Madras, New Delhi               |
++------------+----------------------------------------------------------------+
+| UP6        | (UTC + 6:00) Almaty, Colomba, Dhaka                            |
++------------+----------------------------------------------------------------+
+| UP7        | (UTC + 7:00) Bangkok, Hanoi, Jakarta                           |
++------------+----------------------------------------------------------------+
+| UP8        | (UTC + 8:00) Beijing, Hong Kong, Perth, Singapore, Taipei      |
++------------+----------------------------------------------------------------+
+| UP9        | (UTC + 9:00) Osaka, Sapporo, Seoul, Tokyo, Yakutsk             |
++------------+----------------------------------------------------------------+
+| UP85       | (UTC + 9:30) Adelaide, Darwin                                  |
++------------+----------------------------------------------------------------+
+| UP10       | (UTC + 10:00) Melbourne, Papua New Guinea, Sydney, Vladivostok |
++------------+----------------------------------------------------------------+
+| UP11       | (UTC + 11:00) Magadan, New Caledonia, Solomon Islands          |
++------------+----------------------------------------------------------------+
+| UP12       | (UTC + 12:00) Auckland, Wellington, Fiji, Marshall Island      |
++------------+----------------------------------------------------------------+
diff --git a/user_guide_src/source/helpers/directory_helper.rst b/user_guide_src/source/helpers/directory_helper.rst
new file mode 100644
index 0000000..6c259ad
--- /dev/null
+++ b/user_guide_src/source/helpers/directory_helper.rst
@@ -0,0 +1,81 @@
+################
+Directory Helper
+################
+
+The Directory Helper file contains functions that assist in working with
+directories.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('directory');
+
+The following functions are available:
+
+directory_map('source directory')
+=================================
+
+This function reads the directory path specified in the first parameter
+and builds an array representation of it and all its contained files.
+
+Example
+
+::
+
+	$map = directory_map('./mydirectory/');
+
+.. note:: Paths are almost always relative to your main index.php file.
+
+
+Sub-folders contained within the directory will be mapped as well. If
+you wish to control the recursion depth, you can do so using the second
+parameter (integer). A depth of 1 will only map the top level directory
+
+::
+
+	$map = directory_map('./mydirectory/', 1);
+
+By default, hidden files will not be included in the returned array. To
+override this behavior, you may set a third parameter to true (boolean)
+
+::
+
+	$map = directory_map('./mydirectory/', FALSE, TRUE);
+
+Each folder name will be an array index, while its contained files will
+be numerically indexed. Here is an example of a typical array
+
+::
+
+	Array (    
+		[libraries] => Array    
+			(        
+				[0] => benchmark.html        
+				[1] => config.html        
+				[database] => Array
+					(              
+						[0] => active_record.html              
+						[1] => binds.html              
+						[2] => configuration.html
+						[3] => connecting.html              
+						[4] => examples.html              
+						[5] => fields.html              
+						[6] => index.html
+						[7] => queries.html
+					)        
+				[2] => email.html        
+				[3] => file_uploading.html        
+				[4] => image_lib.html        
+				[5] => input.html        
+				[6] => language.html        
+				[7] => loader.html        
+				[8] => pagination.html        
+				[9] => uri.html
+			)
+
diff --git a/user_guide_src/source/helpers/download_helper.rst b/user_guide_src/source/helpers/download_helper.rst
new file mode 100644
index 0000000..e6094dc
--- /dev/null
+++ b/user_guide_src/source/helpers/download_helper.rst
@@ -0,0 +1,42 @@
+###############
+Download Helper
+###############
+
+The Download Helper lets you download data to your desktop.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('download');
+
+The following functions are available:
+
+force_download('filename', 'data')
+==================================
+
+Generates server headers which force data to be downloaded to your
+desktop. Useful with file downloads. The first parameter is the **name
+you want the downloaded file to be named**, the second parameter is the
+file data. Example
+
+::
+
+	$data = 'Here is some text!';
+	$name = 'mytext.txt';
+	force_download($name, $data);
+
+If you want to download an existing file from your server you'll need to
+read the file into a string
+
+::
+
+	$data = file_get_contents("/path/to/photo.jpg"); // Read the file's contents
+	$name = 'myphoto.jpg';
+	force_download($name, $data);
+
diff --git a/user_guide_src/source/helpers/email_helper.rst b/user_guide_src/source/helpers/email_helper.rst
new file mode 100644
index 0000000..d4e94b1
--- /dev/null
+++ b/user_guide_src/source/helpers/email_helper.rst
@@ -0,0 +1,49 @@
+############
+Email Helper
+############
+
+The Email Helper provides some assistive functions for working with
+Email. For a more robust email solution, see CodeIgniter's :doc:`Email
+Class <../libraries/email>`.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code::
+
+	$this->load->helper('email');
+
+
+The following functions are available:
+
+valid_email('email')
+====================
+
+Checks if an email is a correctly formatted email. Note that is doesn't
+actually prove the email will recieve mail, simply that it is a validly
+formed address.
+
+It returns TRUE/FALSE
+
+::
+
+	$this->load->helper('email');
+
+	if (valid_email('email@somesite.com'))
+	{
+		echo 'email is valid';
+	}
+	else
+	{
+		echo 'email is not valid';
+	}
+
+send_email('recipient', 'subject', 'message')
+=============================================
+
+Sends an email using PHP's native
+`mail() <http://www.php.net/function.mail>`_ function. For a more robust
+email solution, see CodeIgniter's :doc:`Email
+Class <../libraries/email>`.
diff --git a/user_guide_src/source/helpers/file_helper.rst b/user_guide_src/source/helpers/file_helper.rst
new file mode 100644
index 0000000..bfc271e
--- /dev/null
+++ b/user_guide_src/source/helpers/file_helper.rst
@@ -0,0 +1,135 @@
+###########
+File Helper
+###########
+
+The File Helper file contains functions that assist in working with files.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('file');
+
+The following functions are available:
+
+read_file('path')
+=================
+
+Returns the data contained in the file specified in the path. Example
+
+::
+
+	$string = read_file('./path/to/file.php');
+
+The path can be a relative or full server path. Returns FALSE (boolean) on failure.
+
+.. note:: The path is relative to your main site index.php file, NOT your
+	controller or view files. CodeIgniter uses a front controller so paths
+	are always relative to the main site index.
+
+If your server is running an `open_basedir` restriction this function might not work if you are trying to access a file above the calling script.
+
+write_file('path', $data)
+=========================
+
+Writes data to the file specified in the path. If the file does not exist the function will create it. Example
+
+::
+
+	$data = 'Some file data';
+	if ( ! write_file('./path/to/file.php', $data))
+	{     
+		echo 'Unable to write the file';
+	}
+	else
+	{     
+		echo 'File written!';
+	}
+
+You can optionally set the write mode via the third parameter
+
+::
+
+	write_file('./path/to/file.php', $data, 'r+');
+
+The default mode is wb. Please see the `PHP user guide <http://php.net/fopen>`_ for mode options.
+
+Note: In order for this function to write data to a file its file permissions must be set such that it is writable (666, 777, etc.). If the file does not already exist, the directory containing it must be writable.
+
+.. note:: The path is relative to your main site index.php file, NOT your
+	controller or view files. CodeIgniter uses a front controller so paths
+	are always relative to the main site index.
+
+delete_files('path')
+====================
+
+Deletes ALL files contained in the supplied path. Example
+
+::
+
+	delete_files('./path/to/directory/');
+
+If the second parameter is set to true, any directories contained within the supplied root path will be deleted as well. Example
+
+::
+
+	delete_files('./path/to/directory/', TRUE);
+
+.. note:: The files must be writable or owned by the system in order to be deleted.
+
+get_filenames('path/to/directory/')
+===================================
+
+Takes a server path as input and returns an array containing the names of all files contained within it. The file path can optionally be added to the file names by setting the second parameter to TRUE.
+
+get_dir_file_info('path/to/directory/', $top_level_only = TRUE)
+===============================================================
+
+Reads the specified directory and builds an array containing the filenames, filesize, dates, and permissions. Sub-folders contained within the specified path are only read if forced by sending the second parameter, $top_level_only to FALSE, as this can be an intensive operation.
+
+get_file_info('path/to/file', $file_information)
+================================================
+
+Given a file and path, returns the name, path, size, date modified. Second parameter allows you to explicitly declare what information you want returned; options are: `name`, `server_path`, `size`, `date`, `readable`, `writable`, `executable`, `fileperms`. Returns FALSE if the file cannot be found.
+
+.. note:: The "writable" uses the PHP function is_writable() which is known
+	to have issues on the IIS webserver. Consider using fileperms instead,
+	which returns information from PHP's fileperms() function.
+
+get_mime_by_extension('file')
+=============================
+
+Translates a file extension into a mime type based on config/mimes.php. Returns FALSE if it can't determine the type, or open the mime config file.
+
+::
+
+	$file = "somefile.png";
+	echo $file . ' is has a mime type of ' . get_mime_by_extension($file);
+
+
+.. note:: This is not an accurate way of determining file mime types, and
+	is here strictly as a convenience. It should not be used for security.
+
+symbolic_permissions($perms)
+============================
+
+Takes numeric permissions (such as is returned by `fileperms()` and returns standard symbolic notation of file permissions.
+
+::
+
+	echo symbolic_permissions(fileperms('./index.php'));  // -rw-r--r--
+
+octal_permissions($perms)
+=========================
+
+Takes numeric permissions (such as is returned by fileperms() and returns a three character octal notation of file permissions.
+
+::
+
+	echo octal_permissions(fileperms('./index.php'));  // 644
+
diff --git a/user_guide_src/source/helpers/form_helper.rst b/user_guide_src/source/helpers/form_helper.rst
new file mode 100644
index 0000000..3794e08
--- /dev/null
+++ b/user_guide_src/source/helpers/form_helper.rst
@@ -0,0 +1,506 @@
+###########
+Form Helper
+###########
+
+The Form Helper file contains functions that assist in working with
+forms.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('form');
+
+The following functions are available:
+
+form_open()
+===========
+
+Creates an opening form tag with a base URL **built from your config preferences**. It will optionally let you add form attributes and hidden input fields, and will always add the attribute accept-charset based on the charset value in your config file.
+
+The main benefit of using this tag rather than hard coding your own HTML is that it permits your site to be more portable in the event your URLs ever change.
+
+Here's a simple example
+
+::
+
+	echo form_open('email/send');
+
+The above example would create a form that points to your base URL plus the "email/send" URI segments, like this
+
+::
+
+	<form method="post" accept-charset="utf-8" action="http://example.com/index.php/email/send" />
+
+Adding Attributes
+^^^^^^^^^^^^^^^^^
+
+Attributes can be added by passing an associative array to the second
+parameter, like this
+
+::
+
+	$attributes = array('class' => 'email', 'id' => 'myform');  
+	echo form_open('email/send', $attributes);
+
+The above example would create a form similar to this
+
+::
+
+	<form method="post" accept-charset="utf-8" action="http://example.com/index.php/email/send" class="email" id="myform" />
+
+Adding Hidden Input Fields
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Hidden fields can be added by passing an associative array to the third parameter, like this
+
+::
+
+	 $hidden = array('username' => 'Joe', 'member_id' => '234');  
+	echo form_open('email/send', '', $hidden);
+
+The above example would create a form similar to this
+
+::
+
+	<form method="post" accept-charset="utf-8" action="http://example.com/index.php/email/send"> 
+		<input type="hidden" name="username" value="Joe" /> 
+		<input type="hidden" name="member_id" value="234" />
+
+form_open_multipart()
+=====================
+
+This function is absolutely identical to the `form_open()` tag above
+except that it adds a multipart attribute, which is necessary if you
+would like to use the form to upload files with.
+
+form_hidden()
+=============
+
+Lets you generate hidden input fields. You can either submit a
+name/value string to create one field
+
+::
+
+	form_hidden('username', 'johndoe');  
+	// Would produce: <input type="hidden" name="username" value="johndoe" />
+
+Or you can submit an associative array to create multiple fields
+
+::
+
+	$data = array(               
+		'name'  => 'John Doe',               
+		'email' => 'john@example.com',               
+		'url'   => 'http://example.com'             
+	);  
+	
+	echo form_hidden($data);  
+	
+	/*
+		Would produce: 
+		<input type="hidden" name="name" value="John Doe" /> 
+		<input type="hidden" name="email" value="john@example.com" /> 
+		<input type="hidden" name="url" value="http://example.com" />
+	*/
+
+form_input()
+============
+
+Lets you generate a standard text input field. You can minimally pass
+the field name and value in the first and second parameter
+
+::
+
+	echo form_input('username', 'johndoe');
+
+Or you can pass an associative array containing any data you wish your
+form to contain
+
+::
+
+	$data = array(               
+		'name'        => 'username',               
+		'id'          => 'username',               
+		'value'       => 'johndoe',               
+		'maxlength'   => '100',               
+		'size'        => '50',               
+		'style'       => 'width:50%',             
+	);  
+	
+	echo form_input($data);
+	
+	/*
+		Would produce:
+		
+		<input type="text" name="username" id="username" value="johndoe" maxlength="100" size="50" style="width:50%" />
+	*/
+
+If you would like your form to contain some additional data, like
+Javascript, you can pass it as a string in the third parameter
+
+::
+
+	$js = 'onClick="some_function()"';  
+	echo form_input('username', 'johndoe', $js);
+
+form_password()
+===============
+
+This function is identical in all respects to the `form_input()` function above except that it uses the "password" input type.
+
+form_upload()
+=============
+
+This function is identical in all respects to the `form_input()` function above except that it uses the "file" input type, allowing it to be used to upload files.
+
+form_textarea()
+===============
+
+This function is identical in all respects to the `form_input()` function above except that it generates a "textarea" type. Note: Instead of the "maxlength" and "size" attributes in the above example, you will instead specify "rows" and "cols".
+
+form_dropdown()
+===============
+
+Lets you create a standard drop-down field. The first parameter will
+contain the name of the field, the second parameter will contain an
+associative array of options, and the third parameter will contain the
+value you wish to be selected. You can also pass an array of multiple
+items through the third parameter, and CodeIgniter will create a
+multiple select for you. Example
+
+::
+
+	$options = array(                   
+		'small'  => 'Small Shirt',                   
+		'med'    => 'Medium Shirt',                   
+		'large'   => 'Large Shirt',                   
+		'xlarge' => 'Extra Large Shirt',                 
+	);  
+	
+	$shirts_on_sale = array('small', 'large');  
+	echo form_dropdown('shirts', $options, 'large');  
+	
+	/*
+		Would produce:  
+		
+		<select name="shirts"> 
+			<option value="small">Small Shirt</option> 
+			<option value="med">Medium  Shirt</option> 
+			<option value="large" selected="selected">Large Shirt</option> 
+			<option value="xlarge">Extra Large Shirt</option> 
+		</select>
+	*/
+	
+	echo form_dropdown('shirts', $options, $shirts_on_sale);
+	
+	/*
+		Would produce:  
+	
+		<select name="shirts" multiple="multiple"> 
+			<option value="small" selected="selected">Small Shirt</option> 
+			<option value="med">Medium  Shirt</option> 
+			<option value="large" selected="selected">Large Shirt</option> 	
+			<option value="xlarge">Extra Large Shirt</option> 
+		</select>
+	*/
+
+If you would like the opening <select> to contain additional data, like
+an id attribute or JavaScript, you can pass it as a string in the fourth
+parameter
+
+::
+
+	$js = 'id="shirts" onChange="some_function();"';  
+	echo form_dropdown('shirts', $options, 'large', $js);
+
+If the array passed as $options is a multidimensional array,
+`form_dropdown()` will produce an <optgroup> with the array key as the
+label.
+
+form_multiselect()
+==================
+
+Lets you create a standard multiselect field. The first parameter will
+contain the name of the field, the second parameter will contain an
+associative array of options, and the third parameter will contain the
+value or values you wish to be selected. The parameter usage is
+identical to using form_dropdown() above, except of course that the
+name of the field will need to use POST array syntax, e.g. foo[].
+
+form_fieldset()
+================
+
+Lets you generate fieldset/legend fields.
+
+::
+
+	echo form_fieldset('Address Information'); 
+	echo "<p>fieldset content here</p>\n"; 
+	echo form_fieldset_close();
+	
+	/*
+		Produces:
+			<fieldset>  
+				<legend>Address Information</legend>  
+					<p>form content here</p>  
+			</fieldset>
+	*/
+	
+Similar to other functions, you can submit an associative array in the
+second parameter if you prefer to set additional attributes.
+
+::
+
+	$attributes = array(
+		'id' => 'address_info', 
+		'class' => 'address_info'
+	);     
+	
+	echo form_fieldset('Address Information', $attributes); 
+	echo "<p>fieldset content here</p>\n"; 
+	echo form_fieldset_close();   
+	
+	/*
+		Produces: 
+		
+		<fieldset id="address_info" class="address_info">  
+			<legend>Address Information</legend>  
+			<p>form content here</p>  
+		</fieldset>
+	*/
+
+form_fieldset_close()
+=====================
+
+Produces a closing </fieldset> tag. The only advantage to using this
+function is it permits you to pass data to it which will be added below
+the tag. For example
+
+::
+
+	$string = "</div></div>";  
+	echo form_fieldset_close($string);  
+	// Would produce: </fieldset> </div></div>
+
+form_checkbox()
+===============
+
+Lets you generate a checkbox field. Simple example
+
+::
+
+	echo form_checkbox('newsletter', 'accept', TRUE);  
+	// Would produce:  <input type="checkbox" name="newsletter" value="accept" checked="checked" />
+
+The third parameter contains a boolean TRUE/FALSE to determine whether
+the box should be checked or not.
+
+Similar to the other form functions in this helper, you can also pass an
+array of attributes to the function
+
+::
+
+	$data = array(     
+		'name'        => 'newsletter',     
+		'id'          => 'newsletter',     
+		'value'       => 'accept',     
+		'checked'     => TRUE,     
+		'style'       => 'margin:10px',     
+	);  
+	
+	echo form_checkbox($data);  
+	// Would produce: <input type="checkbox" name="newsletter" id="newsletter" value="accept" checked="checked" style="margin:10px" />
+
+As with other functions, if you would like the tag to contain additional
+data, like JavaScript, you can pass it as a string in the fourth
+parameter
+
+::
+
+	$js = 'onClick="some_function()"';   
+	echo form_checkbox('newsletter', 'accept', TRUE, $js)
+
+form_radio()
+============
+
+This function is identical in all respects to the `form_checkbox()`
+function above except that it uses the "radio" input type.
+
+form_submit()
+=============
+
+Lets you generate a standard submit button. Simple example
+
+::
+
+	echo form_submit('mysubmit', 'Submit Post!');  
+	// Would produce:  <input type="submit" name="mysubmit" value="Submit Post!" />
+
+Similar to other functions, you can submit an associative array in the
+first parameter if you prefer to set your own attributes. The third
+parameter lets you add extra data to your form, like JavaScript.
+
+form_label()
+============
+
+Lets you generate a <label>. Simple example
+
+::
+
+	echo form_label('What is your Name', 'username');  
+	// Would produce:  <label for="username">What is your Name</label>
+
+Similar to other functions, you can submit an associative array in the
+third parameter if you prefer to set additional attributes.
+
+::
+
+	$attributes = array(     
+		'class' => 'mycustomclass',     
+		'style' => 'color: #000;'
+	);     
+	
+	echo form_label('What is your Name', 'username', $attributes);          
+	// Would produce:  <label for="username" class="mycustomclass" style="color: #000;">What is your Name</label>
+
+
+form_reset()
+============
+
+Lets you generate a standard reset button. Use is identical to
+`form_submit()`.
+
+form_button()
+=============
+
+Lets you generate a standard button element. You can minimally pass the
+button name and content in the first and second parameter
+
+::
+
+	 echo form_button('name','content');  
+	// Would produce <button name="name" type="button">Content</button>
+
+Or you can pass an associative array containing any data you wish your
+form to contain:
+
+::
+
+	$data = array(     
+		'name' 		=> 'button',     
+		'id' 		=> 'button',     
+		'value' 	=> 'true',     
+		'type' 		=> 'reset',     
+		'content' 	=> 'Reset' 
+	);  
+	
+	echo form_button($data);  
+	// Would produce: <button name="button" id="button" value="true" type="reset">Reset</button>
+
+If you would like your form to contain some additional data, like
+JavaScript, you can pass it as a string in the third parameter:
+
+::
+
+	 $js = 'onClick="some_function()"'; 
+	echo form_button('mybutton', 'Click Me', $js);
+
+form_close()
+============
+
+Produces a closing </form> tag. The only advantage to using this
+function is it permits you to pass data to it which will be added below
+the tag. For example
+
+::
+
+	$string = "</div></div>";  
+	echo form_close($string);  
+	// Would produce:  </form> </div></div>
+
+form_prep()
+===========
+
+Allows you to safely use HTML and characters such as quotes within form
+elements without breaking out of the form. Consider this example
+
+::
+
+	$string = 'Here is a string containing "quoted" text.';  
+	<input type="text" name="myform" value="$string" />
+
+Since the above string contains a set of quotes it will cause the form
+to break. The `form_prep()` function converts HTML so that it can be used
+safely
+
+::
+
+	<input type="text" name="myform" value="<?php echo form_prep($string); ?>" />
+
+.. note:: If you use any of the form helper functions listed in this page the form
+	values will be prepped automatically, so there is no need to call this
+	function. Use it only if you are creating your own form elements.
+
+set_value()
+===========
+
+Permits you to set the value of an input form or textarea. You must
+supply the field name via the first parameter of the function. The
+second (optional) parameter allows you to set a default value for the
+form. Example
+
+::
+
+	<input type="text" name="quantity" value="<?php echo set_value('quantity', '0'); ?>" size="50" />
+
+The above form will show "0" when loaded for the first time.
+
+set_select()
+============
+
+If you use a <select> menu, this function permits you to display the
+menu item that was selected. The first parameter must contain the name
+of the select menu, the second parameter must contain the value of each
+item, and the third (optional) parameter lets you set an item as the
+default (use boolean TRUE/FALSE).
+
+Example
+
+::
+
+	<select name="myselect">
+		<option value="one" <?php echo  set_select('myselect', 'one', TRUE); ?> >One</option> 
+		<option value="two" <?php echo  set_select('myselect', 'two'); ?> >Two</option> 
+		<option value="three" <?php echo  set_select('myselect', 'three'); ?> >Three</option> 
+	</select>
+
+set_checkbox()
+==============
+
+Permits you to display a checkbox in the state it was submitted. The
+first parameter must contain the name of the checkbox, the second
+parameter must contain its value, and the third (optional) parameter
+lets you set an item as the default (use boolean TRUE/FALSE). Example
+
+::
+
+	<input type="checkbox" name="mycheck" value="1" <?php echo set_checkbox('mycheck', '1'); ?> /> 
+	<input type="checkbox" name="mycheck" value="2" <?php echo set_checkbox('mycheck', '2'); ?> />
+
+set_radio()
+===========
+
+Permits you to display radio buttons in the state they were submitted.
+This function is identical to the **set_checkbox()** function above.
+
+::
+
+	<input type="radio" name="myradio" value="1" <?php echo  set_radio('myradio', '1', TRUE); ?> /> 
+	<input type="radio" name="myradio" value="2" <?php echo  set_radio('myradio', '2'); ?> />
+
diff --git a/user_guide_src/source/helpers/html_helper.rst b/user_guide_src/source/helpers/html_helper.rst
new file mode 100644
index 0000000..2e21789
--- /dev/null
+++ b/user_guide_src/source/helpers/html_helper.rst
@@ -0,0 +1,348 @@
+###########
+HTML Helper
+###########
+
+The HTML Helper file contains functions that assist in working with
+HTML.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code::
+
+	$this->load->helper('html');
+
+The following functions are available:
+
+br()
+====
+
+Generates line break tags (<br />) based on the number you submit.
+Example::
+
+	echo br(3);
+
+The above would produce: <br /><br /><br />
+
+heading()
+=========
+
+Lets you create HTML <h1> tags. The first parameter will contain the
+data, the second the size of the heading. Example::
+
+	echo heading('Welcome!', 3);
+
+The above would produce: <h3>Welcome!</h3>
+
+Additionally, in order to add attributes to the heading tag such as HTML
+classes, ids or inline styles, a third parameter is available.
+
+::
+
+	echo heading('Welcome!', 3, 'class="pink"')
+
+The above code produces: <h3 class="pink">Welcome!<<h3>
+
+img()
+=====
+
+Lets you create HTML <img /> tags. The first parameter contains the
+image source. Example
+
+::
+
+	echo img('images/picture.jpg'); // gives <img src="http://site.com/images/picture.jpg" />
+
+There is an optional second parameter that is a TRUE/FALSE value that
+specifics if the src should have the page specified by
+$config['index_page'] added to the address it creates. Presumably, this
+would be if you were using a media controller.
+
+::
+
+	echo img('images/picture.jpg', TRUE); // gives <img src="http://site.com/index.php/images/picture.jpg" alt="" />
+
+
+Additionally, an associative array can be passed to the img() function
+for complete control over all attributes and values. If an alt attribute
+is not provided, CodeIgniter will generate an empty string.
+
+::
+
+	$image_properties = array(               
+		'src' 	=> 'images/picture.jpg',               
+		'alt' 	=> 'Me, demonstrating how to eat 4 slices of pizza at one time',  
+		'class' => 'post_images',               
+		'width' => '200',               
+		'height'=> '200',               
+		'title' => 'That was quite a night',               
+		'rel' 	=> 'lightbox'
+	);
+
+		img($image_properties);     // <img src="http://site.com/index.php/images/picture.jpg" alt="Me, demonstrating how to eat 4 slices of pizza at one time" class="post_images" width="200" height="200" title="That was quite a night" rel="lightbox" />
+
+
+link_tag()
+===========
+
+Lets you create HTML <link /> tags. This is useful for stylesheet links,
+as well as other links. The parameters are href, with optional rel,
+type, title, media and index_page. index_page is a TRUE/FALSE value
+that specifics if the href should have the page specified by
+$config['index_page'] added to the address it creates.
+
+::
+
+	 echo link_tag('css/mystyles.css'); // gives <link href="http://site.com/css/mystyles.css" rel="stylesheet" type="text/css" />
+
+
+Further examples
+
+::
+
+	echo link_tag('favicon.ico', 'shortcut icon', 'image/ico');     // <link href="http://site.com/favicon.ico" rel="shortcut icon" type="image/ico" />
+
+	echo link_tag('feed', 'alternate', 'application/rss+xml', 'My RSS Feed');     // <link href="http://site.com/feed" rel="alternate" type="application/rss+xml" title="My RSS Feed" />
+
+Additionally, an associative array can be passed to the link() function
+for complete control over all attributes and values.
+
+::
+
+	$link = array(               
+		'href' 	=> 'css/printer.css',               
+		'rel' 	=> 'stylesheet',               
+		'type' 	=> 'text/css',               
+		'media' => 'print'
+	);
+
+	echo link_tag($link);     // <link href="http://site.com/css/printer.css" rel="stylesheet" type="text/css" media="print" />
+
+
+nbs()
+=====
+
+Generates non-breaking spaces (&nbsp;) based on the number you submit.
+Example
+
+::
+
+	echo nbs(3);
+
+The above would produce
+
+::
+
+	&nbsp;&nbsp;&nbsp;
+
+ol() and ul()
+=============
+
+Permits you to generate ordered or unordered HTML lists from simple or
+multi-dimensional arrays. Example
+
+::
+
+	$this->load->helper('html');
+
+	$list = array(             
+		'red',              
+		'blue',              
+		'green',             
+		'yellow'             
+	);
+
+	$attributes = array(                     
+		'class' => 'boldlist',                     
+		'id'    => 'mylist'                    
+	);
+
+	echo ul($list, $attributes);
+
+The above code will produce this
+
+::
+
+	 <ul class="boldlist" id="mylist">   
+		<li>red</li>   
+		<li>blue</li>   
+		<li>green</li>   
+		<li>yellow</li>
+	</ul>
+
+Here is a more complex example, using a multi-dimensional array
+
+::
+
+	$this->load->helper('html');
+
+	$attributes = array(                     
+		'class' => 'boldlist',                     
+		'id'    => 'mylist'                     
+	);
+
+	$list = array(             
+		'colors'  => array(                                 
+			'red',                                 
+			'blue',                                 
+			'green'                             
+		),
+		'shapes'  => array(                                 
+			'round',                                  
+			'square',                                 
+			'circles' => array(                                             
+				'ellipse',
+				'oval',
+				'sphere'
+			)                             
+		),             
+		'moods'  => array(                                 
+			'happy',                                  
+			'upset' => array( 	                                       
+				'defeated' => array(
+					'dejected',                
+					'disheartened',
+					'depressed'
+				),
+				'annoyed',
+				'cross',
+				'angry'
+			)
+		)
+	);
+
+	echo ul($list, $attributes);
+
+The above code will produce this
+
+::
+
+	<ul class="boldlist" id="mylist">   
+		<li>colors     
+			<ul>       
+				<li>red</li>       
+				<li>blue</li>       
+				<li>green</li>     
+			</ul>   
+		</li>   
+		<li>shapes     
+			<ul>       
+				<li>round</li>       
+				<li>suare</li>       
+				<li>circles         
+					<ul>           
+						<li>elipse</li>           
+						<li>oval</li>           
+						<li>sphere</li>         
+					</ul>       
+				</li>     
+			</ul>   
+		</li>   
+		<li>moods     
+			<ul>       
+				<li>happy</li>       
+				<li>upset         
+					<ul>           
+						<li>defeated             
+							<ul>               
+								<li>dejected</li>
+								<li>disheartened</li>
+								<li>depressed</li>
+							</ul>
+						</li>
+						<li>annoyed</li>
+						<li>cross</li>           
+						<li>angry</li>         
+					</ul>       
+				</li>     
+			</ul>   
+		</li>
+	</ul>
+
+meta()
+======
+
+Helps you generate meta tags. You can pass strings to the function, or
+simple arrays, or multidimensional ones. Examples
+
+::
+
+	echo meta('description', 'My Great site');
+	// Generates:  <meta name="description" content="My Great Site" />
+
+	echo meta('Content-type', 'text/html; charset=utf-8', 'equiv');
+	// Note the third parameter.  Can be "equiv" or "name"
+	// Generates:  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+
+	echo meta(array('name' => 'robots', 'content' => 'no-cache'));
+	// Generates:  <meta name="robots" content="no-cache" />
+
+	$meta = array(         
+		array(
+			'name' => 'robots',
+			'content' => 'no-cache'
+		),
+		array(
+			'name' => 'description',
+			'content' => 'My Great Site'
+		),
+		array(
+			'name' => 'keywords',
+			'content' => 'love, passion, intrigue, deception'
+		),         
+		array(
+			'name' => 'robots',
+			'content' => 'no-cache'
+		),
+		array(
+			'name' => 'Content-type',
+			'content' => 'text/html; charset=utf-8', 'type' => 'equiv'
+		)
+	);
+
+	echo meta($meta);
+	// Generates:
+	// <meta name="robots" content="no-cache" />
+	// <meta name="description" content="My Great Site" />
+	// <meta name="keywords" content="love, passion, intrigue, deception" />
+	// <meta name="robots" content="no-cache" />
+	// <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+
+doctype()
+=========
+
+Helps you generate document type declarations, or DTD's. XHTML 1.0
+Strict is used by default, but many doctypes are available.
+
+::
+
+	echo doctype(); // <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+	echo doctype('html4-trans'); // <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+
+The following is a list of doctype choices. These are configurable, and
+pulled from application/config/doctypes.php
+
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| Doctype                | Option                   | Result                                                                                                                    |
++========================+==========================+===========================================================================================================================+
+| XHTML 1.1              | doctype('xhtml11')       | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">                         |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| XHTML 1.0 Strict       | doctype('xhtml1-strict') | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">             |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| XHTML 1.0 Transitional | doctype('xhtml1-trans')  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| XHTML 1.0 Frameset     | doctype('xhtml1-frame')  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">         |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| XHTML Basic 1.1        | doctype('xhtml-basic11') | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">             |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| HTML 5                 | doctype('html5')         | <!DOCTYPE html>                                                                                                           |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| HTML 4 Strict          | doctype('html4-strict')  | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">                                |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| HTML 4 Transitional    | doctype('html4-trans')   | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">                    |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
+| HTML 4 Frameset        | doctype('html4-frame')   | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">                     |
++------------------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------+
diff --git a/user_guide_src/source/helpers/index.rst b/user_guide_src/source/helpers/index.rst
new file mode 100644
index 0000000..f28c8e1
--- /dev/null
+++ b/user_guide_src/source/helpers/index.rst
@@ -0,0 +1,9 @@
+#######
+Helpers
+#######
+
+.. toctree::
+	:glob:
+	:titlesonly:
+	
+	*
\ No newline at end of file
diff --git a/user_guide_src/source/helpers/inflector_helper.rst b/user_guide_src/source/helpers/inflector_helper.rst
new file mode 100644
index 0000000..cf246b9
--- /dev/null
+++ b/user_guide_src/source/helpers/inflector_helper.rst
@@ -0,0 +1,79 @@
+################
+Inflector Helper
+################
+
+The Inflector Helper file contains functions that permits you to change
+words to plural, singular, camel case, etc.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('inflector');
+
+The following functions are available:
+
+singular()
+==========
+
+Changes a plural word to singular. Example
+
+::
+
+	$word = "dogs";
+	echo singular($word); // Returns "dog"
+
+plural()
+========
+
+Changes a singular word to plural. Example
+
+::
+
+	$word = "dog";
+	echo plural($word); // Returns "dogs"
+
+To force a word to end with "es" use a second "true" argument.
+
+::
+
+	$word = "pass";
+	echo plural($word, TRUE); // Returns "passes"
+
+camelize()
+==========
+
+Changes a string of words separated by spaces or underscores to camel
+case. Example
+
+::
+
+	$word = "my_dog_spot";
+	echo camelize($word); // Returns "myDogSpot"
+
+underscore()
+============
+
+Takes multiple words separated by spaces and underscores them. Example
+
+::
+
+	$word = "my dog spot";
+	echo underscore($word); // Returns "my_dog_spot"
+
+humanize()
+==========
+
+Takes multiple words separated by underscores and adds spaces between
+them. Each word is capitalized. Example
+
+::
+
+	$word = "my_dog_spot";
+	echo humanize($word); // Returns "My Dog Spot"
+
diff --git a/user_guide_src/source/helpers/language_helper.rst b/user_guide_src/source/helpers/language_helper.rst
new file mode 100644
index 0000000..b7b23d1
--- /dev/null
+++ b/user_guide_src/source/helpers/language_helper.rst
@@ -0,0 +1,33 @@
+###############
+Language Helper
+###############
+
+The Language Helper file contains functions that assist in working with
+language files.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('language');
+
+The following functions are available:
+
+lang('language line', 'element id')
+===================================
+
+This function returns a line of text from a loaded language file with
+simplified syntax that may be more desirable for view files than calling
+`$this->lang->line()`. The optional second parameter will also output a
+form label for you. Example
+
+::
+
+	echo lang('language_key', 'form_item_id');
+	// becomes <label for="form_item_id">language_key</label>
+
diff --git a/user_guide_src/source/helpers/number_helper.rst b/user_guide_src/source/helpers/number_helper.rst
new file mode 100644
index 0000000..28bc2f2
--- /dev/null
+++ b/user_guide_src/source/helpers/number_helper.rst
@@ -0,0 +1,45 @@
+#############
+Number Helper
+#############
+
+The Number Helper file contains functions that help you work with
+numeric data.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('number');
+
+The following functions are available:
+
+byte_format()
+=============
+
+Formats a numbers as bytes, based on size, and adds the appropriate
+suffix. Examples
+
+::
+	
+	echo byte_format(456); // Returns 456 Bytes 
+	echo byte_format(4567); // Returns 4.5 KB 
+	echo byte_format(45678); // Returns 44.6 KB 
+	echo byte_format(456789); // Returns 447.8 KB 
+	echo byte_format(3456789); // Returns 3.3 MB 
+	echo byte_format(12345678912345); // Returns 1.8 GB 
+	echo byte_format(123456789123456789); // Returns 11,228.3 TB
+
+An optional second parameter allows you to set the precision of the
+result.
+
+::
+
+	 echo byte_format(45678, 2); // Returns 44.61 KB
+
+.. note:: The text generated by this function is found in the following
+	language file: language//number_lang.php
diff --git a/user_guide_src/source/helpers/path_helper.rst b/user_guide_src/source/helpers/path_helper.rst
new file mode 100644
index 0000000..1a70af4
--- /dev/null
+++ b/user_guide_src/source/helpers/path_helper.rst
@@ -0,0 +1,37 @@
+###########
+Path Helper
+###########
+
+The Path Helper file contains functions that permits you to work with
+file paths on the server.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('path');
+
+The following functions are available:
+
+set_realpath()
+==============
+
+Checks to see if the path exists. This function will return a server
+path without symbolic links or relative directory structures. An
+optional second argument will cause an error to be triggered if the path
+cannot be resolved.
+
+::
+
+	$directory = '/etc/passwd'; 
+	echo set_realpath($directory); // returns "/etc/passwd"  
+	$non_existent_directory = '/path/to/nowhere'; 
+	echo set_realpath($non_existent_directory, TRUE); // returns an error, as the path could not be resolved  
+	echo set_realpath($non_existent_directory, FALSE); // returns "/path/to/nowhere"   
+
+
diff --git a/user_guide_src/source/helpers/security_helper.rst b/user_guide_src/source/helpers/security_helper.rst
new file mode 100644
index 0000000..01018c6
--- /dev/null
+++ b/user_guide_src/source/helpers/security_helper.rst
@@ -0,0 +1,67 @@
+###############
+Security Helper
+###############
+
+The Security Helper file contains security related functions.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('security');
+
+The following functions are available:
+
+xss_clean()
+===========
+
+Provides Cross Site Script Hack filtering. This function is an alias to
+the one in the :doc:`Input class <../libraries/input>`. More info can
+be found there.
+
+sanitize_filename()
+===================
+
+Provides protection against directory traversal. This function is an
+alias to the one in the :doc:`Security class <../libraries/security>`.
+More info can be found there.
+
+do_hash()
+=========
+
+Permits you to create SHA1 or MD5 one way hashes suitable for encrypting
+passwords. Will create SHA1 by default. Examples
+
+::
+
+	$str = do_hash($str); // SHA1
+	$str = do_hash($str, 'md5'); // MD5
+
+.. note:: This function was formerly named dohash(), which has been
+	deprecated in favor of `do_hash()`.
+
+strip_image_tags()
+==================
+
+This is a security function that will strip image tags from a string. It
+leaves the image URL as plain text.
+
+::
+
+	$string = strip_image_tags($string);
+
+encode_php_tags()
+=================
+
+This is a security function that converts PHP tags to entities. Note: If
+you use the XSS filtering function it does this automatically.
+
+::
+
+	$string = encode_php_tags($string);
+
diff --git a/user_guide_src/source/helpers/smiley_helper.rst b/user_guide_src/source/helpers/smiley_helper.rst
new file mode 100644
index 0000000..941ba11
--- /dev/null
+++ b/user_guide_src/source/helpers/smiley_helper.rst
@@ -0,0 +1,160 @@
+#############
+Smiley Helper
+#############
+
+The Smiley Helper file contains functions that let you manage smileys
+(emoticons).
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('smiley');
+
+Overview
+========
+
+The Smiley helper has a renderer that takes plain text simileys, like
+:-) and turns them into a image representation, like |smile!|
+
+It also lets you display a set of smiley images that when clicked will
+be inserted into a form field. For example, if you have a blog that
+allows user commenting you can show the smileys next to the comment
+form. Your users can click a desired smiley and with the help of some
+JavaScript it will be placed into the form field.
+
+Clickable Smileys Tutorial
+==========================
+
+Here is an example demonstrating how you might create a set of clickable
+smileys next to a form field. This example requires that you first
+download and install the smiley images, then create a controller and the
+View as described.
+
+.. important:: Before you begin, please `download the smiley images <http://codeigniter.com/download_files/smileys.zip>`_
+	and put them in a publicly accessible place on your server. This helper
+	also assumes you have the smiley replacement array located at
+	`application/config/smileys.php`
+
+The Controller
+--------------
+
+In your `application/controllers/` folder, create a file called
+smileys.php and place the code below in it.
+
+.. important:: Change the URL in the `get_clickable_smileys()`
+	function below so that it points to your smiley folder.
+
+You'll notice that in addition to the smiley helper we are using the :doc:`Table Class <../libraries/table>`.
+
+::
+
+	<?php
+
+	class Smileys extends CI_Controller {
+
+		function index()
+		{
+			$this->load->helper('smiley');
+			$this->load->library('table');
+
+			$image_array = get_clickable_smileys('http://example.com/images/smileys/', 'comments');
+			$col_array = $this->table->make_columns($image_array, 8);
+
+			$data['smiley_table'] = $this->table->generate($col_array);
+			$this->load->view('smiley_view', $data);
+		}
+	}
+
+In your `application/views/` folder, create a file called `smiley_view.php`
+and place this code in it:
+
+::
+
+	<html>
+		<head>
+			<title>Smileys</title>
+			<?php echo smiley_js(); ?>
+		</head>
+		<body>
+			<form name="blog">
+				<textarea name="comments" id="comments" cols="40" rows="4"></textarea>
+			</form>
+			<p>Click to insert a smiley!</p>
+			<?php echo $smiley_table; ?> </body> </html>
+			When you have created the above controller and view, load it by visiting http://www.example.com/index.php/smileys/
+		</body>
+	</html>
+
+Field Aliases
+-------------
+
+When making changes to a view it can be inconvenient to have the field
+id in the controller. To work around this, you can give your smiley
+links a generic name that will be tied to a specific id in your view.
+
+::
+
+	$image_array = get_smiley_links("http://example.com/images/smileys/", "comment_textarea_alias");
+
+To map the alias to the field id, pass them both into the `smiley_js`
+function
+
+::
+
+	$image_array = smiley_js("comment_textarea_alias", "comments");
+
+******************
+Function Reference
+******************
+
+get_clickable_smileys()
+=======================
+
+Returns an array containing your smiley images wrapped in a clickable
+link. You must supply the URL to your smiley folder and a field id or
+field alias.
+
+::
+
+	$image_array = get_smiley_links("http://example.com/images/smileys/", "comment");
+
+Note: Usage of this function without the second parameter, in
+combination with `js_insert_smiley` has been deprecated.
+
+smiley_js()
+===========
+
+Generates the JavaScript that allows the images to be clicked and
+inserted into a form field. If you supplied an alias instead of an id
+when generating your smiley links, you need to pass the alias and
+corresponding form id into the function. This function is designed to be
+placed into the <head> area of your web page.
+
+::
+
+	<?php echo smiley_js(); ?>
+
+Note: This function replaces `js_insert_smiley`, which has been
+deprecated.
+
+parse_smileys()
+===============
+
+Takes a string of text as input and replaces any contained plain text
+smileys into the image equivalent. The first parameter must contain your
+string, the second must contain the URL to your smiley folder
+
+::
+
+	$str = 'Here are some simileys: :-)  ;-)';
+	$str = parse_smileys($str, "http://example.com/images/smileys/");
+	echo $str;
+
+
+.. |smile!| image:: ../images/smile.gif
diff --git a/user_guide_src/source/helpers/string_helper.rst b/user_guide_src/source/helpers/string_helper.rst
new file mode 100644
index 0000000..b8a69e0
--- /dev/null
+++ b/user_guide_src/source/helpers/string_helper.rst
@@ -0,0 +1,167 @@
+#############
+String Helper
+#############
+
+The String Helper file contains functions that assist in working with
+strings.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('string');
+
+The following functions are available:
+
+random_string()
+===============
+
+Generates a random string based on the type and length you specify.
+Useful for creating passwords or generating random hashes.
+
+The first parameter specifies the type of string, the second parameter
+specifies the length. The following choices are available:
+
+alpha, alunum, numeric, nozero, unique, md5, encrypt and sha1
+
+-  **alpha**: A string with lower and uppercase letters only.
+-  **alnum**: Alpha-numeric string with lower and uppercase characters.
+-  **numeric**: Numeric string.
+-  **nozero**: Numeric string with no zeros.
+-  **unique**: Encrypted with MD5 and uniqid(). Note: The length
+   parameter is not available for this type. Returns a fixed length 32
+   character string.
+-  **sha1**: An encrypted random number based on do_hash() from the
+   :doc:`security helper <security_helper>`.
+
+Usage example
+
+::
+
+	echo random_string('alnum', 16);
+
+increment_string()
+==================
+
+Increments a string by appending a number to it or increasing the
+number. Useful for creating "copies" or a file or duplicating database
+content which has unique titles or slugs.
+
+Usage example
+
+::
+
+	echo increment_string('file', '_'); // "file_1"
+	echo increment_string('file', '-', 2); // "file-2"
+	echo increment_string('file-4'); // "file-5"
+
+alternator()
+============
+
+Allows two or more items to be alternated between, when cycling through
+a loop. Example
+
+::
+
+	for ($i = 0; $i < 10; $i++)
+	{     
+		echo alternator('string one', 'string two');
+	}
+
+You can add as many parameters as you want, and with each iteration of
+your loop the next item will be returned.
+
+::
+
+	for ($i = 0; $i < 10; $i++)
+	{     
+		echo alternator('one', 'two', 'three', 'four', 'five');
+	}
+
+.. note:: To use multiple separate calls to this function simply call the
+	function with no arguments to re-initialize.
+
+repeater()
+==========
+
+Generates repeating copies of the data you submit. Example
+
+::
+
+	$string = "\n"; echo repeater($string, 30);
+
+The above would generate 30 newlines.
+
+reduce_double_slashes()
+=======================
+
+Converts double slashes in a string to a single slash, except those
+found in http://. Example
+
+::
+
+	$string = "http://example.com//index.php";
+	echo reduce_double_slashes($string); // results in "http://example.com/index.php"
+
+trim_slashes()
+==============
+
+Removes any leading/trailing slashes from a string. Example
+
+::
+
+	$string = "/this/that/theother/";
+	echo trim_slashes($string); // results in this/that/theother
+
+
+reduce_multiples()
+==================
+
+Reduces multiple instances of a particular character occuring directly
+after each other. Example::
+
+	$string = "Fred, Bill,, Joe, Jimmy";
+	$string = reduce_multiples($string,","); //results in "Fred, Bill, Joe, Jimmy"
+
+The function accepts the following parameters:
+
+::
+
+	reduce_multiples(string: text to search in, string: character to reduce, boolean: whether to remove the character from the front and end of the string)
+
+The first parameter contains the string in which you want to reduce the
+multiplies. The second parameter contains the character you want to have
+reduced. The third parameter is FALSE by default; if set to TRUE it will
+remove occurences of the character at the beginning and the end of the
+string. Example:
+
+::
+
+	$string = ",Fred, Bill,, Joe, Jimmy,";
+	$string = reduce_multiples($string, ", ", TRUE); //results in "Fred, Bill, Joe, Jimmy"
+
+
+quotes_to_entities()
+====================
+
+Converts single and double quotes in a string to the corresponding HTML
+entities. Example
+
+::
+
+	$string = "Joe's \"dinner\"";
+	$string = quotes_to_entities($string); //results in "Joe&#39;s &quot;dinner&quot;"
+
+strip_quotes()
+==============
+
+Removes single and double quotes from a string. Example::
+
+	$string = "Joe's \"dinner\"";
+	$string = strip_quotes($string); //results in "Joes dinner"
+
diff --git a/user_guide_src/source/helpers/text_helper.rst b/user_guide_src/source/helpers/text_helper.rst
new file mode 100644
index 0000000..e976432
--- /dev/null
+++ b/user_guide_src/source/helpers/text_helper.rst
@@ -0,0 +1,164 @@
+###########
+Text Helper
+###########
+
+The Text Helper file contains functions that assist in working with
+text.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('text');
+
+The following functions are available:
+
+word_limiter()
+==============
+
+Truncates a string to the number of **words** specified. Example::
+
+	$string = "Here is a nice text string consisting of eleven words.";
+	$string = word_limiter($string, 4);
+	// Returns:  Here is a nice…
+
+The third parameter is an optional suffix added to the string. By
+default it adds an ellipsis.
+
+character_limiter()
+===================
+
+Truncates a string to the number of **characters** specified. It
+maintains the integrity of words so the character count may be slightly
+more or less then what you specify. Example
+
+::
+
+	$string = "Here is a nice text string consisting of eleven words.";
+	$string = character_limiter($string, 20);
+	// Returns:  Here is a nice text string…
+
+The third parameter is an optional suffix added to the string, if
+undeclared this helper uses an ellipsis.
+
+ascii_to_entities()
+===================
+
+Converts ASCII values to character entities, including high ASCII and MS
+Word characters that can cause problems when used in a web page, so that
+they can be shown consistently regardless of browser settings or stored
+reliably in a database. There is some dependence on your server's
+supported character sets, so it may not be 100% reliable in all cases,
+but for the most part it should correctly identify characters outside
+the normal range (like accented characters). Example
+
+::
+
+	$string = ascii_to_entities($string);
+
+entities_to_ascii()
+===================
+
+This function does the opposite of the previous one; it turns character
+entities back into ASCII.
+
+convert_accented_characters()
+=============================
+
+Transliterates high ASCII characters to low ASCII equivalents, useful
+when non-English characters need to be used where only standard ASCII
+characters are safely used, for instance, in URLs.
+
+::
+
+	$string = convert_accented_characters($string);
+
+This function uses a companion config file
+`application/config/foreign_chars.php` to define the to and from array
+for transliteration.
+
+word_censor()
+=============
+
+Enables you to censor words within a text string. The first parameter
+will contain the original string. The second will contain an array of
+words which you disallow. The third (optional) parameter can contain a
+replacement value for the words. If not specified they are replaced with
+pound signs: ####. Example
+
+::
+
+	$disallowed = array('darn', 'shucks', 'golly', 'phooey');
+	$string = word_censor($string, $disallowed, 'Beep!');
+
+highlight_code()
+================
+
+Colorizes a string of code (PHP, HTML, etc.). Example::
+
+	$string = highlight_code($string);
+
+The function uses PHP's highlight_string() function, so the colors used
+are the ones specified in your php.ini file.
+
+highlight_phrase()
+==================
+
+Will highlight a phrase within a text string. The first parameter will
+contain the original string, the second will contain the phrase you wish
+to highlight. The third and fourth parameters will contain the
+opening/closing HTML tags you would like the phrase wrapped in. Example
+
+::
+
+	$string = "Here is a nice text string about nothing in particular.";
+	$string = highlight_phrase($string, "nice text", '<span style="color:#990000">', '</span>');
+
+The above text returns:
+
+Here is a nice text string about nothing in particular.
+
+word_wrap()
+===========
+
+Wraps text at the specified **character** count while maintaining
+complete words. Example
+
+::
+
+	$string = "Here is a simple string of text that will help us demonstrate this function.";
+	echo word_wrap($string, 25);
+
+	// Would produce:  Here is a simple string of text that will help us demonstrate this function
+
+ellipsize()
+===========
+
+This function will strip tags from a string, split it at a defined
+maximum length, and insert an ellipsis.
+
+The first parameter is the string to ellipsize, the second is the number
+of characters in the final string. The third parameter is where in the
+string the ellipsis should appear from 0 - 1, left to right. For
+example. a value of 1 will place the ellipsis at the right of the
+string, .5 in the middle, and 0 at the left.
+
+An optional forth parameter is the kind of ellipsis. By default,
+&hellip; will be inserted.
+
+::
+
+	$str = 'this_string_is_entirely_too_long_and_might_break_my_design.jpg';
+	echo ellipsize($str, 32, .5);
+
+Produces:
+
+::
+
+	this_string_is_e&hellip;ak_my_design.jpg
+
diff --git a/user_guide_src/source/helpers/typography_helper.rst b/user_guide_src/source/helpers/typography_helper.rst
new file mode 100644
index 0000000..f320260
--- /dev/null
+++ b/user_guide_src/source/helpers/typography_helper.rst
@@ -0,0 +1,48 @@
+#################
+Typography Helper
+#################
+
+The Typography Helper file contains functions that help your format text
+in semantically relevant ways.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('typography');
+
+The following functions are available:
+
+auto_typography()
+=================
+
+Formats text so that it is semantically and typographically correct
+HTML. Please see the :doc:`Typography Class <../libraries/typography>`
+for more info.
+
+Usage example::
+
+	$string = auto_typography($string);
+
+.. note:: Typographic formatting can be processor intensive, particularly if
+	you have a lot of content being formatted. If you choose to use this
+	function you may want to consider `caching </general/caching>` your pages.
+
+nl2br_except_pre()
+==================
+
+Converts newlines to <br /> tags unless they appear within <pre> tags.
+This function is identical to the native PHP nl2br() function, except
+that it ignores <pre> tags.
+
+Usage example
+
+::
+
+	$string = nl2br_except_pre($string);
+
diff --git a/user_guide_src/source/helpers/url_helper.rst b/user_guide_src/source/helpers/url_helper.rst
new file mode 100644
index 0000000..c725587
--- /dev/null
+++ b/user_guide_src/source/helpers/url_helper.rst
@@ -0,0 +1,313 @@
+##########
+URL Helper
+##########
+
+The URL Helper file contains functions that assist in working with URLs.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('url');
+
+The following functions are available:
+
+site_url()
+==========
+
+Returns your site URL, as specified in your config file. The index.php
+file (or whatever you have set as your site index_page in your config
+file) will be added to the URL, as will any URI segments you pass to the
+function, and the url_suffix as set in your config file.
+
+You are encouraged to use this function any time you need to generate a
+local URL so that your pages become more portable in the event your URL
+changes.
+
+Segments can be optionally passed to the function as a string or an
+array. Here is a string example
+
+::
+
+	echo site_url("news/local/123");
+
+The above example would return something like:
+http://example.com/index.php/news/local/123
+
+Here is an example of segments passed as an array
+
+::
+
+	$segments = array('news', 'local', '123');
+	echo site_url($segments);
+
+base_url()
+===========
+
+Returns your site base URL, as specified in your config file. Example
+
+::
+
+	echo base_url();
+
+This function returns the same thing as `site_url`, without the
+index_page or url_suffix being appended.
+
+Also like site_url, you can supply segments as a string or an array.
+Here is a string example
+
+::
+
+	echo base_url("blog/post/123");
+
+The above example would return something like:
+http://example.com/blog/post/123
+
+This is useful because unlike `site_url()`, you can supply a string to a
+file, such as an image or stylesheet. For example
+
+::
+
+	echo base_url("images/icons/edit.png");
+
+This would give you something like:
+http://example.com/images/icons/edit.png
+
+current_url()
+=============
+
+Returns the full URL (including segments) of the page being currently
+viewed.
+
+uri_string()
+============
+
+Returns the URI segments of any page that contains this function. For
+example, if your URL was this
+
+::
+
+	http://some-site.com/blog/comments/123
+
+The function would return
+
+::
+
+	/blog/comments/123
+
+index_page()
+============
+
+Returns your site "index" page, as specified in your config file.
+Example
+
+::
+
+	echo index_page();
+
+anchor()
+========
+
+Creates a standard HTML anchor link based on your local site URL
+
+::
+
+	<a href="http://example.com">Click Here</a>
+
+The tag has three optional parameters
+
+::
+
+	anchor(uri segments, text, attributes)
+
+The first parameter can contain any segments you wish appended to the
+URL. As with the site_url() function above, segments can be a string or
+an array.
+
+.. note:: If you are building links that are internal to your application
+	do not include the base URL (http://...). This will be added automatically
+	from the information specified in your config file. Include only the
+	URI segments you wish appended to the URL.
+
+The second segment is the text you would like the link to say. If you
+leave it blank, the URL will be used.
+
+The third parameter can contain a list of attributes you would like
+added to the link. The attributes can be a simple string or an
+associative array.
+
+Here are some examples
+
+::
+
+	echo anchor('news/local/123', 'My News', 'title="News title"');
+
+Would produce: <a href="http://example.com/index.php/news/local/123"
+title="News title">My News</a>
+
+::
+
+	echo anchor('news/local/123', 'My News', array('title' => 'The best news!'));
+
+Would produce: <a href="http://example.com/index.php/news/local/123"
+title="The best news!">My News</a>
+
+anchor_popup()
+==============
+
+Nearly identical to the anchor() function except that it opens the URL
+in a new window. You can specify JavaScript window attributes in the
+third parameter to control how the window is opened. If the third
+parameter is not set it will simply open a new window with your own
+browser settings. Here is an example with attributes
+
+::
+
+	$atts = array(               
+		'width'      => '800',               
+		'height'     => '600',               
+		'scrollbars' => 'yes',               
+		'status'     => 'yes',               
+		'resizable'  => 'yes',               
+		'screenx'    => '0',               
+		'screeny'    => '0'             
+	);
+
+	echo anchor_popup('news/local/123', 'Click Me!', $atts);
+
+Note: The above attributes are the function defaults so you only need to
+set the ones that are different from what you need. If you want the
+function to use all of its defaults simply pass an empty array in the
+third parameter
+
+::
+
+	echo anchor_popup('news/local/123', 'Click Me!', array());
+
+mailto()
+========
+
+Creates a standard HTML email link. Usage example
+
+::
+
+	echo mailto('me@my-site.com', 'Click Here to Contact Me');
+
+As with the anchor() tab above, you can set attributes using the third
+parameter.
+
+safe_mailto()
+=============
+
+Identical to the above function except it writes an obfuscated version
+of the mailto tag using ordinal numbers written with JavaScript to help
+prevent the email address from being harvested by spam bots.
+
+auto_link()
+===========
+
+Automatically turns URLs and email addresses contained in a string into
+links. Example
+
+::
+
+	$string = auto_link($string);
+
+The second parameter determines whether URLs and emails are converted or
+just one or the other. Default behavior is both if the parameter is not
+specified. Email links are encoded as safe_mailto() as shown above.
+
+Converts only URLs
+
+::
+
+	$string = auto_link($string, 'url');
+
+Converts only Email addresses
+
+::
+
+	$string = auto_link($string, 'email');
+
+The third parameter determines whether links are shown in a new window.
+The value can be TRUE or FALSE (boolean)
+
+::
+
+	$string = auto_link($string, 'both', TRUE);
+
+url_title()
+===========
+
+Takes a string as input and creates a human-friendly URL string. This is
+useful if, for example, you have a blog in which you'd like to use the
+title of your entries in the URL. Example
+
+::
+
+	$title = "What's wrong with CSS?";
+	$url_title = url_title($title);  // Produces:  Whats-wrong-with-CSS
+
+The second parameter determines the word delimiter. By default dashes
+are used. Options are: dash, or underscore
+
+::
+
+	$title = "What's wrong with CSS?";
+	$url_title = url_title($title, 'underscore');  // Produces:  Whats_wrong_with_CSS
+
+The third parameter determines whether or not lowercase characters are
+forced. By default they are not. Options are boolean TRUE/FALSE
+
+::
+
+	$title = "What's wrong with CSS?";
+	$url_title = url_title($title, 'underscore', TRUE);  // Produces:  whats_wrong_with_css
+
+prep_url()
+----------
+
+This function will add http:// in the event that a scheme is missing
+from a URL. Pass the URL string to the function like this
+
+::
+
+	$url = "example.com";
+	$url = prep_url($url);
+
+redirect()
+==========
+
+Does a "header redirect" to the URI specified. If you specify the full
+site URL that link will be build, but for local links simply providing
+the URI segments to the controller you want to direct to will create the
+link. The function will build the URL based on your config file values.
+
+The optional second parameter allows you to choose between the
+"location" method (default) or the "refresh" method. Location is faster,
+but on Windows servers it can sometimes be a problem. The optional third
+parameter allows you to send a specific HTTP Response Code - this could
+be used for example to create 301 redirects for search engine purposes.
+The default Response Code is 302. The third parameter is *only*
+available with 'location' redirects, and not 'refresh'. Examples
+
+::
+
+	if ($logged_in == FALSE)
+	{      
+		redirect('/login/form/', 'refresh');
+	}
+
+	// with 301 redirect
+	redirect('/article/13', 'location', 301);
+
+.. note:: In order for this function to work it must be used before anything
+	is outputted to the browser since it utilizes server headers.
+
+.. note:: For very fine grained control over headers, you should use the
+	`Output Library </libraries/output>` set_header() function.
diff --git a/user_guide_src/source/helpers/xml_helper.rst b/user_guide_src/source/helpers/xml_helper.rst
new file mode 100644
index 0000000..be848bc
--- /dev/null
+++ b/user_guide_src/source/helpers/xml_helper.rst
@@ -0,0 +1,38 @@
+##########
+XML Helper
+##########
+
+The XML Helper file contains functions that assist in working with XML
+data.
+
+.. contents:: Page Contents
+
+Loading this Helper
+===================
+
+This helper is loaded using the following code
+
+::
+
+	$this->load->helper('xml');
+
+The following functions are available:
+
+xml_convert()
+=====================
+
+Takes a string as input and converts the following reserved XML
+characters to entities:
+
+- Ampersands: &
+- Less then and greater than characters: < >
+- Single and double quotes: ' "
+- Dashes: -
+
+This function ignores ampersands if they are part of existing character
+entities. Example
+
+::
+
+	$string = xml_convert($string);
+
diff --git a/user_guide_src/source/images/appflowchart.gif b/user_guide_src/source/images/appflowchart.gif
new file mode 100644
index 0000000..422332c
--- /dev/null
+++ b/user_guide_src/source/images/appflowchart.gif
Binary files differ
diff --git a/user_guide_src/source/images/arrow.gif b/user_guide_src/source/images/arrow.gif
new file mode 100644
index 0000000..9e9c79a
--- /dev/null
+++ b/user_guide_src/source/images/arrow.gif
Binary files differ
diff --git a/user_guide_src/source/images/ci_logo.jpg b/user_guide_src/source/images/ci_logo.jpg
new file mode 100644
index 0000000..3ae0eee
--- /dev/null
+++ b/user_guide_src/source/images/ci_logo.jpg
Binary files differ
diff --git a/user_guide_src/source/images/ci_logo_flame.jpg b/user_guide_src/source/images/ci_logo_flame.jpg
new file mode 100644
index 0000000..17e9c58
--- /dev/null
+++ b/user_guide_src/source/images/ci_logo_flame.jpg
Binary files differ
diff --git a/user_guide_src/source/images/ci_quick_ref.png b/user_guide_src/source/images/ci_quick_ref.png
new file mode 100644
index 0000000..c07d6b4
--- /dev/null
+++ b/user_guide_src/source/images/ci_quick_ref.png
Binary files differ
diff --git a/user_guide_src/source/images/codeigniter_1.7.1_helper_reference.pdf b/user_guide_src/source/images/codeigniter_1.7.1_helper_reference.pdf
new file mode 100644
index 0000000..baec6bc
--- /dev/null
+++ b/user_guide_src/source/images/codeigniter_1.7.1_helper_reference.pdf
Binary files differ
diff --git a/user_guide_src/source/images/codeigniter_1.7.1_helper_reference.png b/user_guide_src/source/images/codeigniter_1.7.1_helper_reference.png
new file mode 100644
index 0000000..15a7c15
--- /dev/null
+++ b/user_guide_src/source/images/codeigniter_1.7.1_helper_reference.png
Binary files differ
diff --git a/user_guide_src/source/images/codeigniter_1.7.1_library_reference.pdf b/user_guide_src/source/images/codeigniter_1.7.1_library_reference.pdf
new file mode 100644
index 0000000..312d020
--- /dev/null
+++ b/user_guide_src/source/images/codeigniter_1.7.1_library_reference.pdf
Binary files differ
diff --git a/user_guide_src/source/images/codeigniter_1.7.1_library_reference.png b/user_guide_src/source/images/codeigniter_1.7.1_library_reference.png
new file mode 100644
index 0000000..554ae2e
--- /dev/null
+++ b/user_guide_src/source/images/codeigniter_1.7.1_library_reference.png
Binary files differ
diff --git a/user_guide_src/source/images/file.gif b/user_guide_src/source/images/file.gif
new file mode 100644
index 0000000..8141e03
--- /dev/null
+++ b/user_guide_src/source/images/file.gif
Binary files differ
diff --git a/user_guide_src/source/images/folder.gif b/user_guide_src/source/images/folder.gif
new file mode 100644
index 0000000..fef31a6
--- /dev/null
+++ b/user_guide_src/source/images/folder.gif
Binary files differ
diff --git a/user_guide_src/source/images/smile.gif b/user_guide_src/source/images/smile.gif
new file mode 100644
index 0000000..bf09225
--- /dev/null
+++ b/user_guide_src/source/images/smile.gif
Binary files differ
diff --git a/user_guide_src/source/index.rst b/user_guide_src/source/index.rst
new file mode 100644
index 0000000..e531825
--- /dev/null
+++ b/user_guide_src/source/index.rst
@@ -0,0 +1,45 @@
+Welcome to CodeIgniter
+======================
+
+CodeIgniter is an Application Development Framework - a toolkit - for
+people who build web sites using PHP. Its goal is to enable you to
+develop projects much faster than you could if you were writing code
+from scratch, by providing a rich set of libraries for commonly needed
+tasks, as well as a simple interface and logical structure to access
+these libraries. CodeIgniter lets you creatively focus on your project
+by minimizing the amount of code needed for a given task.
+
+Who is CodeIgniter For?
+=======================
+
+CodeIgniter is right for you if:
+
+-  You want a framework with a small footprint.
+-  You need exceptional performance.
+-  You need broad compatibility with standard hosting accounts that run
+   a variety of PHP versions and configurations.
+-  You want a framework that requires nearly zero configuration.
+-  You want a framework that does not require you to use the command
+   line.
+-  You want a framework that does not require you to adhere to
+   restrictive coding rules.
+-  You are not interested in large-scale monolithic libraries like PEAR.
+-  You do not want to be forced to learn a templating language (although
+   a template parser is optionally available if you desire one).
+-  You eschew complexity, favoring simple solutions.
+-  You need clear, thorough documentation.
+
+
+.. toctree::
+	:glob:
+	:titlesonly:
+	:hidden:
+	
+	*
+	overview/index
+	installation/index
+	general/index
+	libraries/index
+	database/index
+	helpers/index
+	documentation/index
\ No newline at end of file
diff --git a/user_guide_src/source/installation/downloads.rst b/user_guide_src/source/installation/downloads.rst
new file mode 100644
index 0000000..a4a6b7f
--- /dev/null
+++ b/user_guide_src/source/installation/downloads.rst
@@ -0,0 +1,69 @@
+#######################
+Downloading CodeIgniter
+#######################
+
+-  `CodeIgniter V 2.1.0 (Current
+   version) <http://codeigniter.com/downloads/>`_
+-  `CodeIgniter V
+   2.0.3 <http://codeigniter.com/download_files/reactor/CodeIgniter_2.0.3.zip>`_
+-  `CodeIgniter V
+   2.0.2 <http://codeigniter.com/download_files/reactor/CodeIgniter_2.0.2.zip>`_
+-  `CodeIgniter V
+   2.0.1 <http://codeigniter.com/download_files/reactor/CodeIgniter_2.0.1.zip>`_
+-  `CodeIgniter V
+   2.0.0 <http://codeigniter.com/download_files/reactor/CodeIgniter_2.0.0.zip>`_
+-  `CodeIgniter V
+   1.7.3 <http://codeigniter.com/download_files/CodeIgniter_1.7.3.zip>`_
+-  `CodeIgniter V
+   1.7.2 <http://codeigniter.com/download_files/CodeIgniter_1.7.2.zip>`_
+-  `CodeIgniter V
+   1.7.1 <http://codeigniter.com/download_files/CodeIgniter_1.7.1.zip>`_
+-  `CodeIgniter V
+   1.7.0 <http://codeigniter.com/download_files/CodeIgniter_1.7.0.zip>`_
+-  `CodeIgniter V
+   1.6.3 <http://codeigniter.com/download_files/CodeIgniter_1.6.3.zip>`_
+-  `CodeIgniter V
+   1.6.2 <http://codeigniter.com/download_files/CodeIgniter_1.6.2.zip>`_
+-  `CodeIgniter V
+   1.6.1 <http://codeigniter.com/download_files/CodeIgniter_1.6.1.zip>`_
+-  `CodeIgniter V
+   1.6.0 <http://codeigniter.com/download_files/CodeIgniter_1.6.0.zip>`_
+-  `CodeIgniter V
+   1.5.4 <http://codeigniter.com/download_files/CodeIgniter_1.5.4.zip>`_
+-  `CodeIgniter V
+   1.5.3 <http://codeigniter.com/download_files/CodeIgniter_1.5.3.zip>`_
+-  `CodeIgniter V
+   1.5.2 <http://codeigniter.com/download_files/CodeIgniter_1.5.2.zip>`_
+-  `CodeIgniter V
+   1.5.1 <http://codeigniter.com/download_files/CodeIgniter_1.5.1.zip>`_
+-  `CodeIgniter V
+   1.4.1 <http://codeigniter.com/download_files/CodeIgniter_1.4.1.zip>`_
+-  `CodeIgniter V
+   1.3.3 <http://codeigniter.com/download_files/CodeIgniter_1.3.3.zip>`_
+-  `CodeIgniter V
+   1.3.2 <http://codeigniter.com/download_files/CodeIgniter_1.3.2.zip>`_
+-  `CodeIgniter V
+   1.3.1 <http://codeigniter.com/download_files/CodeIgniter_1.3.1.zip>`_
+-  `CodeIgniter V
+   1.3 <http://codeigniter.com/download_files/CodeIgniter_1.3.zip>`_
+-  `CodeIgniter V
+   1.2 <http://codeigniter.com/download_files/CodeIgniter_1.2.zip>`_
+-  `CodeIgniter V
+   1.1 <http://codeigniter.com/download_files/CodeIgniter_1.1b.zip>`_
+-  `CodeIgniter V
+   1.0 <http://codeigniter.com/download_files/CodeIgniter_1.0b.zip>`_
+
+
+******
+GitHub
+******
+
+`Git <http://git-scm.com/about>`_ is a distributed version control system.
+
+Public Git access is available at `GitHub <https://github.com/EllisLab/CodeIgniter>`_.
+Please note that while every effort is made to keep this code base
+functional, we cannot guarantee the functionality of code taken from
+the develop branch.
+
+Beginning with version 2.0.3, stable tags are also available via GitHub,
+simply select the version from the Tags dropdown.
\ No newline at end of file
diff --git a/user_guide_src/source/installation/index.rst b/user_guide_src/source/installation/index.rst
new file mode 100644
index 0000000..7f75f78
--- /dev/null
+++ b/user_guide_src/source/installation/index.rst
@@ -0,0 +1,54 @@
+#########################
+Installation Instructions
+#########################
+
+CodeIgniter is installed in four steps:
+
+#. Unzip the package.
+#. Upload the CodeIgniter folders and files to your server. Normally the
+   index.php file will be at your root.
+#. Open the application/config/config.php file with a text editor and
+   set your base URL. If you intend to use encryption or sessions, set
+   your encryption key.
+#. If you intend to use a database, open the
+   application/config/database.php file with a text editor and set your
+   database settings.
+
+If you wish to increase security by hiding the location of your
+CodeIgniter files you can rename the system and application folders to
+something more private. If you do rename them, you must open your main
+index.php file and set the $system_path and $application_folder
+variables at the top of the file with the new name you've chosen.
+
+For the best security, both the system and any application folders
+should be placed above web root so that they are not directly accessible
+via a browser. By default, .htaccess files are included in each folder
+to help prevent direct access, but it is best to remove them from public
+access entirely in case the web server configuration changes or doesn't
+abide by the .htaccess.
+
+If you would like to keep your views public it is also possible to move
+the views folder out of your application folder.
+
+After moving them, open your main index.php file and set the
+$system_path, $application_folder and $view_folder variables,
+preferably with a full path, e.g. '/www/MyUser/system'.
+
+One additional measure to take in production environments is to disable
+PHP error reporting and any other development-only functionality. In
+CodeIgniter, this can be done by setting the ENVIRONMENT constant, which
+is more fully described on the :doc:`security
+page <../general/security>`.
+
+That's it!
+
+If you're new to CodeIgniter, please read the :doc:`Getting
+Started <../overview/getting_started>` section of the User Guide
+to begin learning how to build dynamic PHP applications. Enjoy!
+
+.. toctree::
+	:glob:
+	:hidden:
+	:titlesonly:
+	
+	*
\ No newline at end of file
diff --git a/user_guide_src/source/installation/troubleshooting.rst b/user_guide_src/source/installation/troubleshooting.rst
new file mode 100644
index 0000000..0dfd408
--- /dev/null
+++ b/user_guide_src/source/installation/troubleshooting.rst
@@ -0,0 +1,19 @@
+###############
+Troubleshooting
+###############
+
+If you find that no matter what you put in your URL only your default
+page is loading, it might be that your server does not support the
+PATH_INFO variable needed to serve search-engine friendly URLs. As a
+first step, open your application/config/config.php file and look for
+the URI Protocol information. It will recommend that you try a couple
+alternate settings. If it still doesn't work after you've tried this
+you'll need to force CodeIgniter to add a question mark to your URLs. To
+do this open your application/config/config.php file and change this::
+
+	$config['index_page'] = "index.php";
+
+To this::
+
+	$config['index_page'] = "index.php?";
+
diff --git a/user_guide_src/source/installation/upgrade_120.rst b/user_guide_src/source/installation/upgrade_120.rst
new file mode 100644
index 0000000..76c510d
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_120.rst
@@ -0,0 +1,20 @@
+####################################
+Upgrading From Beta 1.0 to Final 1.2
+####################################
+
+To upgrade to Version 1.2 please replace the following directories with
+the new versions:
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+-  drivers
+-  helpers
+-  init
+-  language
+-  libraries
+-  plugins
+-  scaffolding
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_130.rst b/user_guide_src/source/installation/upgrade_130.rst
new file mode 100644
index 0000000..6d6d4b9
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_130.rst
@@ -0,0 +1,125 @@
+#########################
+Upgrading from 1.2 to 1.3
+#########################
+
+.. note:: The instructions on this page assume you are running version
+	1.2. If you have not upgraded to that version please do so first.
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace the following directories in your "system" folder with the new
+versions:
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+-  application/**models**/ (new for 1.3)
+-  codeigniter (new for 1.3)
+-  drivers
+-  helpers
+-  init
+-  language
+-  libraries
+-  plugins
+-  scaffolding
+
+Step 2: Update your error files
+===============================
+
+Version 1.3 contains two new error templates located in
+application/errors, and for naming consistency the other error templates
+have been renamed.
+
+If you **have not** customized any of the error templates simply replace
+this folder:
+
+-  application/errors/
+
+If you **have** customized your error templates, rename them as follows:
+
+-  404.php = error_404.php
+-  error.php = error_general.php
+-  error_db.php (new)
+-  error_php.php (new)
+
+Step 3: Update your index.php file
+==================================
+
+Please open your main index.php file (located at your root). At the very
+bottom of the file, change this::
+
+	require_once BASEPATH.'libraries/Front_controller'.EXT;
+
+To this::
+
+	require_once BASEPATH.'codeigniter/CodeIgniter'.EXT;
+
+Step 4: Update your config.php file
+===================================
+
+Open your application/config/config.php file and add these new items::
+
+
+    /*
+    |------------------------------------------------
+    | URL suffix
+    |------------------------------------------------
+    |
+    | This option allows you to add a suffix to all URLs.
+    | For example, if a URL is this:
+    |
+    | example.com/index.php/products/view/shoes
+    |
+    | You can optionally add a suffix, like ".html",
+    | making the page appear to be of a certain type:
+    |
+    | example.com/index.php/products/view/shoes.html
+    |
+    */
+    $config['url_suffix'] = "";
+
+
+    /*
+    |------------------------------------------------
+    | Enable Query Strings
+    |------------------------------------------------
+    |
+    | By default CodeIgniter uses search-engine and
+    | human-friendly segment based URLs:
+    |
+    | example.com/who/what/where/
+    |
+    | You can optionally enable standard query string
+    | based URLs:
+    |
+    | example.com?who=me&what=something&where=here
+    |
+    | Options are: TRUE or FALSE (boolean)
+    |
+    | The two other items let you set the query string "words"
+    | that will invoke your controllers and functions:
+    | example.com/index.php?c=controller&m=function
+    |
+    */
+    $config['enable_query_strings'] = FALSE;
+    $config['controller_trigger'] = 'c';
+    $config['function_trigger'] = 'm';
+
+Step 5: Update your database.php file
+=====================================
+
+Open your application/config/database.php file and add these new items::
+
+
+    $db['default']['dbprefix'] = "";
+    $db['default']['active_r'] = TRUE;
+
+Step 6: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_131.rst b/user_guide_src/source/installation/upgrade_131.rst
new file mode 100644
index 0000000..8927c1b
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_131.rst
@@ -0,0 +1,30 @@
+###########################
+Upgrading from 1.3 to 1.3.1
+###########################
+
+.. note:: The instructions on this page assume you are running version
+	1.3. If you have not upgraded to that version please do so first.
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace the following directories in your "system" folder with the new
+versions:
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+-  drivers
+-  init/init_unit_test.php (new for 1.3.1)
+-  language/
+-  libraries
+-  scaffolding
+
+Step 2: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_132.rst b/user_guide_src/source/installation/upgrade_132.rst
new file mode 100644
index 0000000..84b7cb4
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_132.rst
@@ -0,0 +1,28 @@
+#############################
+Upgrading from 1.3.1 to 1.3.2
+#############################
+
+.. note:: The instructions on this page assume you are running version
+	1.3.1. If you have not upgraded to that version please do so first.
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace the following directories in your "system" folder with the new
+versions:
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+-  drivers
+-  init
+-  libraries
+
+Step 2: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_133.rst b/user_guide_src/source/installation/upgrade_133.rst
new file mode 100644
index 0000000..4212e45
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_133.rst
@@ -0,0 +1,44 @@
+#############################
+Upgrading from 1.3.2 to 1.3.3
+#############################
+
+.. note:: The instructions on this page assume you are running version
+	1.3.2. If you have not upgraded to that version please do so first.
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace the following directories in your "system" folder with the new
+versions:
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+-  codeigniter
+-  drivers
+-  helpers
+-  init
+-  libraries
+
+Step 2: Update your Models
+==========================
+
+If you are **NOT** using CodeIgniter's
+:doc:`Models <../general/models>` feature disregard this step.
+
+As of version 1.3.3, CodeIgniter does **not** connect automatically to
+your database when a model is loaded. This allows you greater
+flexibility in determining which databases you would like used with your
+models. If your application is not connecting to your database prior to
+a model being loaded you will have to update your code. There are
+several options for connecting, :doc:`as described
+here <../general/models>`.
+
+Step 3: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_140.rst b/user_guide_src/source/installation/upgrade_140.rst
new file mode 100644
index 0000000..987281f
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_140.rst
@@ -0,0 +1,72 @@
+#############################
+Upgrading from 1.3.3 to 1.4.0
+#############################
+
+.. note:: The instructions on this page assume you are running version
+	1.3.3. If you have not upgraded to that version please do so first.
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace the following directories in your "system" folder with the new
+versions:
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+-  application/config/**hooks.php**
+-  application/config/**mimes.php**
+-  codeigniter
+-  drivers
+-  helpers
+-  init
+-  language
+-  libraries
+-  scaffolding
+
+Step 2: Update your config.php file
+===================================
+
+Open your application/config/config.php file and add these new items::
+
+
+
+    /*
+    |--------------------------------------------------------------------------
+    | Enable/Disable System Hooks
+    |--------------------------------------------------------------------------
+    |
+    | If you would like to use the "hooks" feature you must enable it by
+    | setting this variable to TRUE (boolean).  See the user guide for details.
+    |
+    */
+    $config['enable_hooks'] = FALSE;
+
+
+    /*
+    |--------------------------------------------------------------------------
+    | Allowed URL Characters
+    |--------------------------------------------------------------------------
+    |
+    | This lets you specify which characters are permitted within your URLs.
+    | When someone tries to submit a URL with disallowed characters they will
+    | get a warning message.
+    |
+    | As a security measure you are STRONGLY encouraged to restrict URLs to
+    | as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
+    |
+    | Leave blank to allow all characters -- but only if you are insane.
+    |
+    | DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
+    |
+    */
+    $config['permitted_uri_chars'] = 'a-z 0-9~%.:_-';
+
+Step 3: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_141.rst b/user_guide_src/source/installation/upgrade_141.rst
new file mode 100644
index 0000000..c9c2ca4
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_141.rst
@@ -0,0 +1,71 @@
+#############################
+Upgrading from 1.4.0 to 1.4.1
+#############################
+
+.. note:: The instructions on this page assume you are running version
+	1.4.0. If you have not upgraded to that version please do so first.
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace the following directories in your "system" folder with the new
+versions:
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+-  codeigniter
+-  drivers
+-  helpers
+-  libraries
+
+Step 2: Update your config.php file
+===================================
+
+Open your application/config/config.php file and add this new item::
+
+
+
+    /*
+    |--------------------------------------------------------------------------
+    | Output Compression
+    |--------------------------------------------------------------------------
+    |
+    | Enables Gzip output compression for faster page loads.  When enabled,
+    | the output class will test whether your server supports Gzip.
+    | Even if it does, however, not all browsers support compression
+    | so enable only if you are reasonably sure your visitors can handle it.
+    |
+    | VERY IMPORTANT:  If you are getting a blank page when compression is enabled it
+    | means you are prematurely outputting something to your browser. It could
+    | even be a line of whitespace at the end of one of your scripts.  For
+    | compression to work, nothing can be sent before the output buffer is called
+    | by the output class.  Do not "echo" any values with compression enabled.
+    |
+    */
+    $config['compress_output'] = FALSE;
+
+Step 3: Rename an Autoload Item
+===============================
+
+Open the following file: application/config/autoload.php
+
+Find this array item::
+
+	$autoload['core'] = array();
+
+And rename it to this::
+
+	$autoload['libraries'] = array();
+
+This change was made to improve clarity since some users were not sure
+that their own libraries could be auto-loaded.
+
+Step 4: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_150.rst b/user_guide_src/source/installation/upgrade_150.rst
new file mode 100644
index 0000000..bfe01eb
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_150.rst
@@ -0,0 +1,100 @@
+#############################
+Upgrading from 1.4.1 to 1.5.0
+#############################
+
+.. note:: The instructions on this page assume you are running version
+	1.4.1. If you have not upgraded to that version please do so first.
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  application/config/user_agents.php (new file for 1.5)
+-  application/config/smileys.php (new file for 1.5)
+-  codeigniter/
+-  database/ (new folder for 1.5. Replaces the "drivers" folder)
+-  helpers/
+-  language/
+-  libraries/
+-  scaffolding/
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Update your database.php file
+=====================================
+
+Open your application/config/database.php file and add these new items::
+
+
+    $db['default']['cache_on'] = FALSE;
+    $db['default']['cachedir'] = '';
+
+Step 3: Update your config.php file
+===================================
+
+Open your application/config/config.php file and ADD these new items::
+
+
+    /*
+    |--------------------------------------------------------------------------
+    | Class Extension Prefix
+    |--------------------------------------------------------------------------
+    |
+    | This item allows you to set the filename/classname prefix when extending
+    | native libraries.  For more information please see the user guide:
+    |
+    | http://codeigniter.com/user_guide/general/core_classes.html
+    | http://codeigniter.com/user_guide/general/creating_libraries.html
+    |
+    */
+    $config['subclass_prefix'] = 'MY_';
+
+    /*
+    |--------------------------------------------------------------------------
+    | Rewrite PHP Short Tags
+    |--------------------------------------------------------------------------
+    |
+    | If your PHP installation does not have short tag support enabled CI
+    | can rewrite the tags on-the-fly, enabling you to utilize that syntax
+    | in your view files.  Options are TRUE or FALSE (boolean)
+    |
+    */
+    $config['rewrite_short_tags'] = FALSE;
+
+In that same file REMOVE this item::
+
+
+    /*
+    |--------------------------------------------------------------------------
+    | Enable/Disable Error Logging
+    |--------------------------------------------------------------------------
+    |
+    | If you would like errors or debug messages logged set this variable to
+    | TRUE (boolean).  Note: You must set the file permissions on the "logs" folder
+    | such that it is writable.
+    |
+    */
+    $config['log_errors'] = FALSE;
+
+Error logging is now disabled simply by setting the threshold to zero.
+
+Step 4: Update your main index.php file
+=======================================
+
+If you are running a stock index.php file simply replace your version
+with the new one.
+
+If your index.php file has internal modifications, please add your
+modifications to the new file and use it.
+
+Step 5: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_152.rst b/user_guide_src/source/installation/upgrade_152.rst
new file mode 100644
index 0000000..781c907
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_152.rst
@@ -0,0 +1,39 @@
+#############################
+Upgrading from 1.5.0 to 1.5.2
+#############################
+
+.. note:: The instructions on this page assume you are running version
+	1.5.0 or 1.5.1. If you have not upgraded to that version please do so
+	first.
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/helpers/download_helper.php
+-  system/helpers/form_helper.php
+-  system/libraries/Table.php
+-  system/libraries/User_agent.php
+-  system/libraries/Exceptions.php
+-  system/libraries/Input.php
+-  system/libraries/Router.php
+-  system/libraries/Loader.php
+-  system/libraries/Image_lib.php
+-  system/language/english/unit_test_lang.php
+-  system/database/DB_active_rec.php
+-  system/database/drivers/mysqli/mysqli_driver.php
+-  codeigniter/
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_153.rst b/user_guide_src/source/installation/upgrade_153.rst
new file mode 100644
index 0000000..e3d487b
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_153.rst
@@ -0,0 +1,28 @@
+#############################
+Upgrading from 1.5.2 to 1.5.3
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/database/drivers
+-  system/helpers
+-  system/libraries/Input.php
+-  system/libraries/Loader.php
+-  system/libraries/Profiler.php
+-  system/libraries/Table.php
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_154.rst b/user_guide_src/source/installation/upgrade_154.rst
new file mode 100644
index 0000000..1bf3156
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_154.rst
@@ -0,0 +1,47 @@
+#############################
+Upgrading from 1.5.3 to 1.5.4
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  application/config/mimes.php
+-  system/codeigniter
+-  system/database
+-  system/helpers
+-  system/libraries
+-  system/plugins
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Add charset to your config.php
+======================================
+
+Add the following to application/config/config.php
+
+::
+
+	/*     |--------------------------------------------------------------------------     | Default Character Set     |--------------------------------------------------------------------------     |     | This determines which character set is used by default in various methods     | that require a character set to be provided.     |     */     $config['charset'] = "UTF-8";
+
+Step 3: Autoloading language files
+==================================
+
+If you want to autoload any language files, add this line to
+application/config/autoload.php
+
+::
+
+	$autoload['language'] = array();
+
+Step 4: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_160.rst b/user_guide_src/source/installation/upgrade_160.rst
new file mode 100644
index 0000000..daba2e5
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_160.rst
@@ -0,0 +1,76 @@
+#############################
+Upgrading from 1.5.4 to 1.6.0
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/codeigniter
+-  system/database
+-  system/helpers
+-  system/libraries
+-  system/plugins
+-  system/language
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Add time_to_update to your config.php
+===============================================
+
+Add the following to application/config/config.php with the other
+session configuration options
+
+::
+
+	$config['sess_time_to_update']         = 300;
+
+
+Step 3: Add $autoload['model']
+==============================
+
+Add the following to application/config/autoload.php
+
+::
+
+	 /*     | -------------------------------------------------------------------     |  Auto-load Model files     | -------------------------------------------------------------------     | Prototype:     |     |  $autoload['model'] = array('my_model');     |     */          $autoload['model'] = array();
+
+
+Step 4: Add to your database.php
+================================
+
+Make the following changes to your application/config/database.php file:
+
+Add the following variable above the database configuration options,
+with $active_group
+
+::
+
+	$active_record = TRUE;
+
+
+Remove the following from your database configuration options
+
+::
+
+	$db['default']['active_r'] = TRUE;
+
+
+Add the following to your database configuration options
+
+::
+
+	$db['default']['char_set'] = "utf8"; $db['default']['dbcollat'] = "utf8_general_ci";
+
+
+Step 5: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_161.rst b/user_guide_src/source/installation/upgrade_161.rst
new file mode 100644
index 0000000..4386922
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_161.rst
@@ -0,0 +1,27 @@
+#############################
+Upgrading from 1.6.0 to 1.6.1
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/codeigniter
+-  system/database
+-  system/helpers
+-  system/language
+-  system/libraries
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_162.rst b/user_guide_src/source/installation/upgrade_162.rst
new file mode 100644
index 0000000..6a618e4
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_162.rst
@@ -0,0 +1,45 @@
+#############################
+Upgrading from 1.6.1 to 1.6.2
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/codeigniter
+-  system/database
+-  system/helpers
+-  system/language
+-  system/libraries
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Encryption Key
+======================
+
+If you are using sessions, open up application/config/config.php and
+verify you've set an encryption key.
+
+Step 3: Constants File
+======================
+
+Copy /application/config/constants.php to your installation, and modify
+if necessary.
+
+Step 4: Mimes File
+==================
+
+Replace /application/config/mimes.php with the dowloaded version. If
+you've added custom mime types, you'll need to re-add them.
+
+Step 5: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_163.rst b/user_guide_src/source/installation/upgrade_163.rst
new file mode 100644
index 0000000..e24e203
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_163.rst
@@ -0,0 +1,27 @@
+#############################
+Upgrading from 1.6.2 to 1.6.3
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/codeigniter
+-  system/database
+-  system/helpers
+-  system/language
+-  system/libraries
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Update your user guide
+==============================
+
+Please also replace your local copy of the user guide with the new
+version.
diff --git a/user_guide_src/source/installation/upgrade_170.rst b/user_guide_src/source/installation/upgrade_170.rst
new file mode 100644
index 0000000..fefb2ea
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_170.rst
@@ -0,0 +1,56 @@
+#############################
+Upgrading from 1.6.3 to 1.7.0
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/codeigniter
+-  system/database
+-  system/helpers
+-  system/language
+-  system/libraries
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Update your Session Table
+=================================
+
+If you are using the Session class in your application, AND if you are
+storing session data to a database, you must add a new column named
+user_data to your session table. Here is an example of what this column
+might look like for MySQL::
+
+	user_data text NOT NULL
+
+To add this column you will run a query similar to this::
+
+	ALTER TABLE `ci_sessions` ADD `user_data` text NOT NULL
+
+You'll find more information regarding the new Session functionality in
+the :doc:`Session class <../libraries/sessions>` page.
+
+Step 3: Update your Validation Syntax
+=====================================
+
+This is an **optional**, but recommended step, for people currently
+using the Validation class. CI 1.7 introduces a new :doc:`Form Validation
+class <../libraries/form_validation>`, which deprecates the old
+Validation library. We have left the old one in place so that existing
+applications that use it will not break, but you are encouraged to
+migrate to the new version as soon as possible. Please read the user
+guide carefully as the new library works a little differently, and has
+several new features.
+
+Step 4: Update your user guide
+==============================
+
+Please replace your local copy of the user guide with the new version,
+including the image files.
diff --git a/user_guide_src/source/installation/upgrade_171.rst b/user_guide_src/source/installation/upgrade_171.rst
new file mode 100644
index 0000000..e791b4e
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_171.rst
@@ -0,0 +1,27 @@
+#############################
+Upgrading from 1.7.0 to 1.7.1
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/codeigniter
+-  system/database
+-  system/helpers
+-  system/language
+-  system/libraries
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Update your user guide
+==============================
+
+Please replace your local copy of the user guide with the new version,
+including the image files.
diff --git a/user_guide_src/source/installation/upgrade_172.rst b/user_guide_src/source/installation/upgrade_172.rst
new file mode 100644
index 0000000..16f6dec
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_172.rst
@@ -0,0 +1,48 @@
+#############################
+Upgrading from 1.7.1 to 1.7.2
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace these files and directories in your "system" folder with the new
+versions:
+
+-  system/codeigniter
+-  system/database
+-  system/helpers
+-  system/language
+-  system/libraries
+-  index.php
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Remove header() from 404 error template
+===============================================
+
+If you are using header() in your 404 error template, such as the case
+with the default error_404.php template shown below, remove that line
+of code.
+
+::
+
+	<?php header("HTTP/1.1 404 Not Found"); ?>
+
+404 status headers are now properly handled in the show_404() method
+itself.
+
+Step 3: Confirm your system_path
+=================================
+
+In your updated index.php file, confirm that the $system_path variable
+is set to your application's system folder.
+
+Step 4: Update your user guide
+==============================
+
+Please replace your local copy of the user guide with the new version,
+including the image files.
diff --git a/user_guide_src/source/installation/upgrade_200.rst b/user_guide_src/source/installation/upgrade_200.rst
new file mode 100644
index 0000000..064e1b5
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_200.rst
@@ -0,0 +1,90 @@
+#############################
+Upgrading from 1.7.2 to 2.0.0
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace all files and directories in your "system" folder **except**
+your application folder.
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Adjust get_dir_file_info() where necessary
+=====================================================
+
+Version 2.0.0 brings a non-backwards compatible change to
+get_dir_file_info() in the :doc:`File
+Helper <../helpers/file_helper>`. Non-backwards compatible changes
+are extremely rare in CodeIgniter, but this one we feel was warranted
+due to how easy it was to create serious server performance issues. If
+you *need* recursiveness where you are using this helper function,
+change such instances, setting the second parameter, $top_level_only
+to FALSE::
+
+	get_dir_file_info('/path/to/directory', FALSE);
+
+Step 3: Convert your Plugins to Helpers
+=======================================
+
+2.0.0 gets rid of the "Plugin" system as their functionality was
+identical to Helpers, but non-extensible. You will need to rename your
+plugin files from filename_pi.php to filename_helper.php, move them to
+your helpers folder, and change all instances of::
+
+	$this->load->plugin('foo');
+
+to ::
+
+	$this->load->helper('foo');
+
+
+Step 4: Update stored encrypted data
+====================================
+
+.. note:: If your application does not use the Encryption library, does
+	not store Encrypted data permanently, or is on an environment that does
+	not support Mcrypt, you may skip this step.
+
+The Encryption library has had a number of improvements, some for
+encryption strength and some for performance, that has an unavoidable
+consequence of making it no longer possible to decode encrypted data
+produced by the original version of this library. To help with the
+transition, a new method has been added, encode_from_legacy() that
+will decode the data with the original algorithm and return a re-encoded
+string using the improved methods. This will enable you to easily
+replace stale encrypted data with fresh in your applications, either on
+the fly or en masse.
+
+Please read `how to use this
+method <../libraries/encryption.html#legacy>`_ in the Encryption library
+documentation.
+
+Step 5: Remove loading calls for the compatibility helper.
+==========================================================
+
+The compatibility helper has been removed from the CodeIgniter core. All
+methods in it should be natively available in supported PHP versions.
+
+Step 6: Update Class extension
+==============================
+
+All core classes are now prefixed with CI\_. Update Models and
+Controllers to extend CI_Model and CI_Controller, respectively.
+
+Step 7: Update Parent Constructor calls
+=======================================
+
+All native CodeIgniter classes now use the PHP 5 \__construct()
+convention. Please update extended libraries to call
+parent::\__construct().
+
+Step 8: Update your user guide
+==============================
+
+Please replace your local copy of the user guide with the new version,
+including the image files.
diff --git a/user_guide_src/source/installation/upgrade_201.rst b/user_guide_src/source/installation/upgrade_201.rst
new file mode 100644
index 0000000..4c6b3c3
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_201.rst
@@ -0,0 +1,38 @@
+#############################
+Upgrading from 2.0.0 to 2.0.1
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace all files and directories in your "system" folder and replace
+your index.php file. If any modifications were made to your index.php
+they will need to be made fresh in this new one.
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Replace config/mimes.php
+================================
+
+This config file has been updated to contain more mime types, please
+copy it to application/config/mimes.php.
+
+Step 3: Check for forms posting to default controller
+=====================================================
+
+The default behavior for form_open() when called with no parameters
+used to be to post to the default controller, but it will now just leave
+an empty action="" meaning the form will submit to the current URL. If
+submitting to the default controller was the expected behavior it will
+need to be changed from::
+
+	echo form_open(); //<form action="" method="post" accept-charset="utf-8">
+
+to use either a / or base_url()::
+
+	echo form_open('/'); //<form action="http://example.com/index.php/" method="post" accept-charset="utf-8"> echo form_open(base_url()); //<form action="http://example.com/" method="post" accept-charset="utf-8">
+
diff --git a/user_guide_src/source/installation/upgrade_202.rst b/user_guide_src/source/installation/upgrade_202.rst
new file mode 100644
index 0000000..8dbd38a
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_202.rst
@@ -0,0 +1,33 @@
+#############################
+Upgrading from 2.0.1 to 2.0.2
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace all files and directories in your "system" folder and replace
+your index.php file. If any modifications were made to your index.php
+they will need to be made fresh in this new one.
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Remove loading calls for the Security Library
+=====================================================
+
+Security has been moved to the core and is now always loaded
+automatically. Make sure you remove any loading calls as they will
+result in PHP errors.
+
+Step 3: Move MY_Security
+=========================
+
+If you are overriding or extending the Security library, you will need
+to move it to application/core.
+
+csrf_token_name and csrf_hash have changed to protected class
+properties. Please use security->get_csrf_hash() and
+security->get_csrf_token_name() to access those values.
diff --git a/user_guide_src/source/installation/upgrade_203.rst b/user_guide_src/source/installation/upgrade_203.rst
new file mode 100644
index 0000000..481b4fd
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_203.rst
@@ -0,0 +1,62 @@
+#############################
+Upgrading from 2.0.2 to 2.0.3
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace all files and directories in your "system" folder and replace
+your index.php file. If any modifications were made to your index.php
+they will need to be made fresh in this new one.
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
+
+Step 2: Update your main index.php file
+=======================================
+
+If you are running a stock index.php file simply replace your version
+with the new one.
+
+If your index.php file has internal modifications, please add your
+modifications to the new file and use it.
+
+Step 3: Replace config/user_agents.php
+=======================================
+
+This config file has been updated to contain more user agent types,
+please copy it to application/config/user_agents.php.
+
+Step 4: Change references of the EXT constant to ".php"
+=======================================================
+
+.. note:: The EXT Constant has been marked as deprecated, but has not
+	been removed from the application. You are encouraged to make the
+	changes sooner rather than later.
+
+Step 5: Remove APPPATH.'third_party' from autoload.php
+=======================================================
+
+Open application/config/autoload.php, and look for the following::
+
+	$autoload['packages'] = array(APPPATH.'third_party');
+
+If you have not chosen to load any additional packages, that line can be
+changed to::
+
+	$autoload['packages'] = array();
+
+Which should provide for nominal performance gains if not autoloading
+packages.
+
+Update Sessions Database Tables
+===============================
+
+If you are using database sessions with the CI Session Library, please
+update your ci_sessions database table as follows::
+
+	     CREATE INDEX last_activity_idx ON ci_sessions(last_activity);     ALTER TABLE ci_sessions MODIFY user_agent VARCHAR(120);
+
diff --git a/user_guide_src/source/installation/upgrade_210.rst b/user_guide_src/source/installation/upgrade_210.rst
new file mode 100644
index 0000000..9d7e1a2
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_210.rst
@@ -0,0 +1,22 @@
+#############################
+Upgrading from 2.0.3 to 2.1.0
+#############################
+
+Before performing an update you should take your site offline by
+replacing the index.php file with a static one.
+
+Step 1: Update your CodeIgniter files
+=====================================
+
+Replace all files and directories in your "system" folder and replace
+your index.php file. If any modifications were made to your index.php
+they will need to be made fresh in this new one.
+
+Step 2: Replace config/user_agents.php
+======================================
+
+This config file has been updated to contain more user agent types,
+please copy it to application/config/user_agents.php.
+
+.. note:: If you have any custom developed files in these folders please
+	make copies of them first.
\ No newline at end of file
diff --git a/user_guide_src/source/installation/upgrade_b11.rst b/user_guide_src/source/installation/upgrade_b11.rst
new file mode 100644
index 0000000..1d8efbe
--- /dev/null
+++ b/user_guide_src/source/installation/upgrade_b11.rst
@@ -0,0 +1,57 @@
+###################################
+Upgrading From Beta 1.0 to Beta 1.1
+###################################
+
+To upgrade to Beta 1.1 please perform the following steps:
+
+Step 1: Replace your index file
+===============================
+
+Replace your main index.php file with the new index.php file. Note: If
+you have renamed your "system" folder you will need to edit this info in
+the new file.
+
+Step 2: Relocate your config folder
+===================================
+
+This version of CodeIgniter now permits multiple sets of "applications"
+to all share a common set of backend files. In order to enable each
+application to have its own configuration values, the config directory
+must now reside inside of your application folder, so please move it
+there.
+
+Step 3: Replace directories
+===========================
+
+Replace the following directories with the new versions:
+
+-  drivers
+-  helpers
+-  init
+-  libraries
+-  scaffolding
+
+Step 4: Add the calendar language file
+======================================
+
+There is a new language file corresponding to the new calendaring class
+which must be added to your language folder. Add the following item to
+your version: language/english/calendar_lang.php
+
+Step 5: Edit your config file
+=============================
+
+The original application/config/config.php file has a typo in it Open
+the file and look for the items related to cookies::
+
+	$conf['cookie_prefix']    = ""; $conf['cookie_domain']  = ""; $conf['cookie_path']    = "/";
+
+Change the array name from $conf to $config, like this::
+
+	$config['cookie_prefix']  = ""; $config['cookie_domain']    = ""; $config['cookie_path']  = "/";
+
+Lastly, add the following new item to the config file (and edit the
+option if needed)::
+
+	 /* |------------------------------------------------ | URI PROTOCOL |------------------------------------------------ | | This item determines which server global  | should be used to retrieve the URI string.  The  | default setting of "auto" works for most servers. | If your links do not seem to work, try one of  | the other delicious flavors: |  | 'auto'            Default - auto detects | 'path_info'       Uses the PATH_INFO  | 'query_string'    Uses the QUERY_STRING */  $config['uri_protocol'] = "auto";
+
diff --git a/user_guide_src/source/installation/upgrading.rst b/user_guide_src/source/installation/upgrading.rst
new file mode 100644
index 0000000..2badffc
--- /dev/null
+++ b/user_guide_src/source/installation/upgrading.rst
@@ -0,0 +1,32 @@
+#################################
+Upgrading From a Previous Version
+#################################
+
+Please read the upgrade notes corresponding to the version you are
+upgrading from.
+
+-  :doc:`Upgrading from 2.0.3 to 2.1.0 <upgrade_210>`
+-  :doc:`Upgrading from 2.0.2 to 2.0.3 <upgrade_203>`
+-  :doc:`Upgrading from 2.0.1 to 2.0.2 <upgrade_202>`
+-  :doc:`Upgrading from 2.0 to 2.0.1 <upgrade_201>`
+-  :doc:`Upgrading from 1.7.2 to 2.0 <upgrade_200>`
+-  :doc:`Upgrading from 1.7.1 to 1.7.2 <upgrade_172>`
+-  :doc:`Upgrading from 1.7.0 to 1.7.1 <upgrade_171>`
+-  :doc:`Upgrading from 1.6.3 to 1.7.0 <upgrade_170>`
+-  :doc:`Upgrading from 1.6.2 to 1.6.3 <upgrade_163>`
+-  :doc:`Upgrading from 1.6.1 to 1.6.2 <upgrade_162>`
+-  :doc:`Upgrading from 1.6.0 to 1.6.1 <upgrade_161>`
+-  :doc:`Upgrading from 1.5.4 to 1.6.0 <upgrade_160>`
+-  :doc:`Upgrading from 1.5.3 to 1.5.4 <upgrade_154>`
+-  :doc:`Upgrading from 1.5.2 to 1.5.3 <upgrade_153>`
+-  :doc:`Upgrading from 1.5.0 or 1.5.1 to 1.5.2 <upgrade_152>`
+-  :doc:`Upgrading from 1.4.1 to 1.5.0 <upgrade_150>`
+-  :doc:`Upgrading from 1.4.0 to 1.4.1 <upgrade_141>`
+-  :doc:`Upgrading from 1.3.3 to 1.4.0 <upgrade_140>`
+-  :doc:`Upgrading from 1.3.2 to 1.3.3 <upgrade_133>`
+-  :doc:`Upgrading from 1.3.1 to 1.3.2 <upgrade_132>`
+-  :doc:`Upgrading from 1.3 to 1.3.1 <upgrade_131>`
+-  :doc:`Upgrading from 1.2 to 1.3 <upgrade_130>`
+-  :doc:`Upgrading from 1.1 to 1.2 <upgrade_120>`
+-  :doc:`Upgrading from Beta 1.0 to Beta 1.1 <upgrade_b11>`
+
diff --git a/user_guide_src/source/libraries/benchmark.rst b/user_guide_src/source/libraries/benchmark.rst
new file mode 100644
index 0000000..2588f72
--- /dev/null
+++ b/user_guide_src/source/libraries/benchmark.rst
@@ -0,0 +1,122 @@
+##################
+Benchmarking Class
+##################
+
+CodeIgniter has a Benchmarking class that is always active, enabling the
+time difference between any two marked points to be calculated.
+
+.. note:: This class is initialized automatically by the system so there
+	is no need to do it manually.
+
+In addition, the benchmark is always started the moment the framework is
+invoked, and ended by the output class right before sending the final
+view to the browser, enabling a very accurate timing of the entire
+system execution to be shown.
+
+.. contents:: Table of Contents
+
+Using the Benchmark Class
+=========================
+
+The Benchmark class can be used within your
+:doc:`controllers </general/controllers>`,
+:doc:`views </general/views>`, or your :doc:`models </general/models>`.
+The process for usage is this:
+
+#. Mark a start point
+#. Mark an end point
+#. Run the "elapsed time" function to view the results
+
+Here's an example using real code::
+
+	$this->benchmark->mark('code_start');
+	
+	// Some code happens here
+	
+	$this->benchmark->mark('code_end');
+	
+	echo $this->benchmark->elapsed_time('code_start', 'code_end');
+
+.. note:: The words "code_start" and "code_end" are arbitrary. They
+	are simply words used to set two markers. You can use any words you
+	want, and you can set multiple sets of markers. Consider this example::
+
+		$this->benchmark->mark('dog');
+	
+		// Some code happens here
+	
+		$this->benchmark->mark('cat');
+	
+		// More code happens here
+	
+		$this->benchmark->mark('bird');
+	
+		echo $this->benchmark->elapsed_time('dog', 'cat');
+		echo $this->benchmark->elapsed_time('cat', 'bird');
+		echo $this->benchmark->elapsed_time('dog', 'bird');
+
+
+Profiling Your Benchmark Points
+===============================
+
+If you want your benchmark data to be available to the
+:doc:`Profiler </general/profiling>` all of your marked points must
+be set up in pairs, and each mark point name must end with _start and
+_end. Each pair of points must otherwise be named identically. Example::
+
+	 $this->benchmark->mark('my_mark_start');
+	
+	// Some code happens here...
+	
+	$this->benchmark->mark('my_mark_end');
+	
+	$this->benchmark->mark('another_mark_start');
+	
+	// Some more code happens here...
+	
+	$this->benchmark->mark('another_mark_end');
+
+Please read the :doc:`Profiler page </general/profiling>` for more
+information.
+
+Displaying Total Execution Time
+===============================
+
+If you would like to display the total elapsed time from the moment
+CodeIgniter starts to the moment the final output is sent to the
+browser, simply place this in one of your view templates::
+
+	<?php echo $this->benchmark->elapsed_time();?>
+
+You'll notice that it's the same function used in the examples above to
+calculate the time between two point, except you are **not** using any
+parameters. When the parameters are absent, CodeIgniter does not stop
+the benchmark until right before the final output is sent to the
+browser. It doesn't matter where you use the function call, the timer
+will continue to run until the very end.
+
+An alternate way to show your elapsed time in your view files is to use
+this pseudo-variable, if you prefer not to use the pure PHP::
+
+	{elapsed_time}
+
+.. note:: If you want to benchmark anything within your controller
+	functions you must set your own start/end points.
+
+Displaying Memory Consumption
+=============================
+
+If your PHP installation is configured with --enable-memory-limit, you
+can display the amount of memory consumed by the entire system using the
+following code in one of your view file::
+
+	<?php echo $this->benchmark->memory_usage();?>
+
+.. note:: This function can only be used in your view files. The consumption
+	will reflect the total memory used by the entire app.
+
+An alternate way to show your memory usage in your view files is to use
+this pseudo-variable, if you prefer not to use the pure PHP::
+
+	{memory_usage}
+
diff --git a/user_guide_src/source/libraries/caching.rst b/user_guide_src/source/libraries/caching.rst
new file mode 100644
index 0000000..2f06d29
--- /dev/null
+++ b/user_guide_src/source/libraries/caching.rst
@@ -0,0 +1,220 @@
+##############
+Caching Driver
+##############
+
+CodeIgniter features wrappers around some of the most popular forms of
+fast and dynamic caching. All but file-based caching require specific
+server requirements, and a Fatal Exception will be thrown if server
+requirements are not met.
+
+.. contents:: Table of Contents
+
+*************
+Example Usage
+*************
+
+The following example will load the cache driver, specify `APC <#apc>`_
+as the driver to use, and fall back to file-based caching if APC is not
+available in the hosting environment.
+
+::
+
+	$this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file'));
+	
+	if ( ! $foo = $this->cache->get('foo'))
+	{
+		echo 'Saving to the cache!<br />';
+		$foo = 'foobarbaz!';
+		
+		// Save into the cache for 5 minutes
+		$this->cache->save('foo', $foo, 300);
+	}
+	
+	echo $foo;
+
+******************
+Function Reference
+******************
+
+.. php:class:: CI_Cache
+
+is_supported()
+===============
+
+	.. php:method:: is_supported ( $driver )
+
+		This function is automatically called when accessing drivers via
+		$this->cache->get(). However, if the individual drivers are used, make
+		sure to call this function to ensure the driver is supported in the
+		hosting environment.
+		
+		:param string $driver: the name of the caching driver
+		:returns: TRUE if supported, FALSE if not
+		:rtype: Boolean
+		
+		::
+				
+			if ($this->cache->apc->is_supported()
+			{
+				if ($data = $this->cache->apc->get('my_cache'))
+				{
+					// do things.
+				}
+			}
+
+
+get()
+=====
+
+	.. php:method:: get ( $id )
+	
+		This function will attempt to fetch an item from the cache store. If the
+		item does not exist, the function will return FALSE.
+
+		:param string $id: name of cached item
+		:returns: The item if it exists, FALSE if it does not
+		:rtype: Mixed
+		
+		::
+
+			$foo = $this->cache->get('my_cached_item');
+
+
+save()
+======
+
+	.. php:method:: save ( $id , $data [, $ttl])
+	
+		This function will save an item to the cache store. If saving fails, the
+		function will return FALSE.
+
+		:param string $id: name of the cached item
+		:param mixed $data: the data to save
+		:param int $ttl: Time To Live, in seconds (default 60)
+		:returns: TRUE on success, FALSE on failure
+		:rtype: Boolean
+
+		::
+
+			$this->cache->save('cache_item_id', 'data_to_cache');
+	
+delete()
+========
+
+	.. php:method:: delete ( $id )
+	
+		This function will delete a specific item from the cache store. If item
+		deletion fails, the function will return FALSE.
+
+		:param string $id: name of cached item
+		:returns: TRUE if deleted, FALSE if the deletion fails
+		:rtype: Boolean
+		
+		::
+
+			$this->cache->delete('cache_item_id');
+
+clean()
+=======
+
+	.. php:method:: clean ( )
+	
+		This function will 'clean' the entire cache. If the deletion of the
+		cache files fails, the function will return FALSE.
+
+		:returns: TRUE if deleted, FALSE if the deletion fails
+		:rtype: Boolean
+		
+		::
+
+			$this->cache->clean();
+
+cache_info()
+=============
+
+	.. php:method:: cache_info ( )
+
+		This function will return information on the entire cache.
+
+		:returns: information on the entire cache
+		:rtype: Mixed
+		
+		::
+
+			var_dump($this->cache->cache_info());
+		
+		.. note:: The information returned and the structure of the data is dependent
+			on which adapter is being used.
+	
+
+get_metadata()
+===============
+
+	.. php:method:: get_metadata ( $id )
+	
+		This function will return detailed information on a specific item in the
+		cache.
+		
+		:param string $id: name of cached item
+		:returns: metadadta for the cached item
+		:rtype: Mixed
+		
+		::
+
+			var_dump($this->cache->get_metadata('my_cached_item'));
+
+		.. note:: The information returned and the structure of the data is dependent
+			on which adapter is being used.
+
+			
+*******
+Drivers
+*******
+
+Alternative PHP Cache (APC) Caching
+===================================
+
+All of the functions listed above can be accessed without passing a
+specific adapter to the driver loader as follows::
+
+	$this->load->driver('cache');
+	$this->cache->apc->save('foo', 'bar', 10);
+
+For more information on APC, please see
+`http://php.net/apc <http://php.net/apc>`_
+
+File-based Caching
+==================
+
+Unlike caching from the Output Class, the driver file-based caching
+allows for pieces of view files to be cached. Use this with care, and
+make sure to benchmark your application, as a point can come where disk
+I/O will negate positive gains by caching.
+
+All of the functions listed above can be accessed without passing a
+specific adapter to the driver loader as follows::
+
+	$this->load->driver('cache');
+	$this->cache->file->save('foo', 'bar', 10);
+
+Memcached Caching
+=================
+
+Multiple Memcached servers can be specified in the memcached.php
+configuration file, located in the application/config/ directory.
+
+All of the functions listed above can be accessed without passing a
+specific adapter to the driver loader as follows::
+
+	$this->load->driver('cache');
+	$this->cache->memcached->save('foo', 'bar', 10);
+
+For more information on Memcached, please see
+`http://php.net/memcached <http://php.net/memcached>`_
+
+Dummy Cache
+===========
+
+This is a caching backend that will always 'miss.' It stores no data,
+but lets you keep your caching code in place in environments that don't
+support your chosen cache.
diff --git a/user_guide_src/source/libraries/calendar.rst b/user_guide_src/source/libraries/calendar.rst
new file mode 100644
index 0000000..b60b8e4
--- /dev/null
+++ b/user_guide_src/source/libraries/calendar.rst
@@ -0,0 +1,181 @@
+#################
+Calendaring Class
+#################
+
+The Calendar class enables you to dynamically create calendars. Your
+calendars can be formatted through the use of a calendar template,
+allowing 100% control over every aspect of its design. In addition, you
+can pass data to your calendar cells.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the Calendar class is
+initialized in your controller using the $this->load->library function::
+
+	$this->load->library('calendar');
+
+Once loaded, the Calendar object will be available using::
+
+	$this->calendar
+
+Displaying a Calendar
+=====================
+
+Here is a very simple example showing how you can display a calendar::
+
+	$this->load->library('calendar');
+	echo $this->calendar->generate();
+
+The above code will generate a calendar for the current month/year based
+on your server time. To show a calendar for a specific month and year
+you will pass this information to the calendar generating function::
+
+	$this->load->library('calendar');
+	echo $this->calendar->generate(2006, 6);
+
+The above code will generate a calendar showing the month of June in
+2006. The first parameter specifies the year, the second parameter
+specifies the month.
+
+Passing Data to your Calendar Cells
+===================================
+
+To add data to your calendar cells involves creating an associative
+array in which the keys correspond to the days you wish to populate and
+the array value contains the data. The array is passed to the third
+parameter of the calendar generating function. Consider this example::
+
+	$this->load->library('calendar');
+
+	$data = array(
+		3  => 'http://example.com/news/article/2006/03/',
+		7  => 'http://example.com/news/article/2006/07/',
+		13 => 'http://example.com/news/article/2006/13/',
+		26 => 'http://example.com/news/article/2006/26/'
+	);
+
+	echo $this->calendar->generate(2006, 6, $data);
+
+Using the above example, day numbers 3, 7, 13, and 26 will become links
+pointing to the URLs you've provided.
+
+.. note:: By default it is assumed that your array will contain links.
+	In the section that explains the calendar template below you'll see how
+	you can customize how data passed to your cells is handled so you can
+	pass different types of information.
+
+Setting Display Preferences
+===========================
+
+There are seven preferences you can set to control various aspects of
+the calendar. Preferences are set by passing an array of preferences in
+the second parameter of the loading function. Here is an example::
+
+	$prefs = array (
+		'start_day'	=> 'saturday',
+		'month_type'   => 'long',
+		'day_type'	 => 'short'
+	);
+
+	$this->load->library('calendar', $prefs);
+
+	echo $this->calendar->generate();
+
+The above code would start the calendar on saturday, use the "long"
+month heading, and the "short" day names. More information regarding
+preferences below.
+
++-----------------------+-----------+-----------------------------------------------+-------------------------------------------------------------------+
+| Preference            | Default   | Options                                       |    Description                                                    |
++=======================+===========+===============================================+===================================================================+
+| **template**          | None      | None                                          | A string containing your calendar template.                       |
+|                       |           |                                               | See the template section below.                                   |
++-----------------------+-----------+-----------------------------------------------+-------------------------------------------------------------------+
+| **local_time**        | time()    | None                                          | A Unix timestamp corresponding to the current time.               |
++-----------------------+-----------+-----------------------------------------------+-------------------------------------------------------------------+
+| **start_day**         | sunday    | Any week day (sunday, monday, tuesday, etc.)  | Sets the day of the week the calendar should start on.            |
++-----------------------+-----------+-----------------------------------------------+-------------------------------------------------------------------+
+| **month_type**        | long      | long, short                                   | Determines what version of the month name to use in the header.   |
+|                       |           |                                               | long = January, short = Jan.                                      |
++-----------------------+-----------+-----------------------------------------------+-------------------------------------------------------------------+
+| **day_type**          | abr       | long, short, abr                              | Determines what version of the weekday names to use in            |
+|                       |           |                                               | the column headers.                                               |
+|                       |           |                                               | long = Sunday, short = Sun, abr = Su.                             |
++-----------------------+-----------+-----------------------------------------------+-------------------------------------------------------------------+
+| **show_next_prev**    | FALSE     | TRUE/FALSE (boolean)                          | Determines whether to display links allowing you to toggle        |
+|                       |           |                                               | to next/previous months. See information on this feature below.   |
++-----------------------+-----------+-----------------------------------------------+-------------------------------------------------------------------+
+| **next_prev_url**     | None      | A URL                                         | Sets the basepath used in the next/previous calendar links.       |
++-----------------------+-----------+-----------------------------------------------+-------------------------------------------------------------------+
+
+
+Showing Next/Previous Month Links
+=================================
+
+To allow your calendar to dynamically increment/decrement via the
+next/previous links requires that you set up your calendar code similar
+to this example::
+
+	$prefs = array (
+				   'show_next_prev'  => TRUE,
+				   'next_prev_url'   => 'http://example.com/index.php/calendar/show/'
+				 );
+
+	$this->load->library('calendar', $prefs);
+
+	echo $this->calendar->generate($this->uri->segment(3), $this->uri->segment(4));
+
+You'll notice a few things about the above example:
+
+-  You must set the "show_next_prev" to TRUE.
+-  You must supply the URL to the controller containing your calendar in
+   the "next_prev_url" preference.
+-  You must supply the "year" and "month" to the calendar generating
+   function via the URI segments where they appear (Note: The calendar
+   class automatically adds the year/month to the base URL you
+   provide.).
+
+Creating a Calendar Template
+============================
+
+By creating a calendar template you have 100% control over the design of
+your calendar. Each component of your calendar will be placed within a
+pair of pseudo-variables as shown here::
+
+	$prefs['template'] = '
+
+		{table_open}<table border="0" cellpadding="0" cellspacing="0">{/table_open}
+
+		{heading_row_start}<tr>{/heading_row_start}
+
+		{heading_previous_cell}<th><a href="{previous_url}">&lt;&lt;</a></th>{/heading_previous_cell}
+		{heading_title_cell}<th colspan="{colspan}">{heading}</th>{/heading_title_cell}
+		{heading_next_cell}<th><a href="{next_url}">&gt;&gt;</a></th>{/heading_next_cell}
+
+		{heading_row_end}</tr>{/heading_row_end}
+
+		{week_row_start}<tr>{/week_row_start}
+		{week_day_cell}<td>{week_day}</td>{/week_day_cell}
+		{week_row_end}</tr>{/week_row_end}
+
+		{cal_row_start}<tr>{/cal_row_start}
+		{cal_cell_start}<td>{/cal_cell_start}
+
+		{cal_cell_content}<a href="{content}">{day}</a>{/cal_cell_content}
+		{cal_cell_content_today}<div class="highlight"><a href="{content}">{day}</a></div>{/cal_cell_content_today}
+
+		{cal_cell_no_content}{day}{/cal_cell_no_content}
+		{cal_cell_no_content_today}<div class="highlight">{day}</div>{/cal_cell_no_content_today}
+
+		{cal_cell_blank}&nbsp;{/cal_cell_blank}
+
+		{cal_cell_end}</td>{/cal_cell_end}
+		{cal_row_end}</tr>{/cal_row_end}
+
+		{table_close}</table>{/table_close}
+	';
+
+	$this->load->library('calendar', $prefs);
+
+	echo $this->calendar->generate();
\ No newline at end of file
diff --git a/user_guide_src/source/libraries/cart.rst b/user_guide_src/source/libraries/cart.rst
new file mode 100644
index 0000000..2384e92
--- /dev/null
+++ b/user_guide_src/source/libraries/cart.rst
@@ -0,0 +1,294 @@
+###################
+Shopping Cart Class
+###################
+
+The Cart Class permits items to be added to a session that stays active
+while a user is browsing your site. These items can be retrieved and
+displayed in a standard "shopping cart" format, allowing the user to
+update the quantity or remove items from the cart.
+
+Please note that the Cart Class ONLY provides the core "cart"
+functionality. It does not provide shipping, credit card authorization,
+or other processing components.
+
+.. contents:: Page Contents
+
+Initializing the Shopping Cart Class
+====================================
+
+.. important:: The Cart class utilizes CodeIgniter's :doc:`Session
+	Class <sessions>` to save the cart information to a database, so
+	before using the Cart class you must set up a database table as
+	indicated in the :doc:`Session Documentation <sessions>`, and set the
+	session preferences in your application/config/config.php file to
+	utilize a database.
+
+To initialize the Shopping Cart Class in your controller constructor,
+use the $this->load->library function::
+
+	$this->load->library('cart');
+
+Once loaded, the Cart object will be available using::
+ 	
+	$this->cart
+
+.. note:: The Cart Class will load and initialize the Session Class
+	automatically, so unless you are using sessions elsewhere in your
+	application, you do not need to load the Session class.
+
+Adding an Item to The Cart
+==========================
+
+To add an item to the shopping cart, simply pass an array with the
+product information to the $this->cart->insert() function, as shown
+below::
+
+	$data = array(
+		'id'		=> 'sku_123ABC',
+		'qty'	=> 1,
+		'price'	=> 39.95,
+		'name'	=> 'T-Shirt',
+		'options'	=> array('Size' => 'L', 'Color' => 'Red')
+	);
+
+	$this->cart->insert($data);
+
+.. important:: The first four array indexes above (id, qty, price, and
+	name) are **required**. If you omit any of them the data will not be
+	saved to the cart. The fifth index (options) is optional. It is intended
+	to be used in cases where your product has options associated with it.
+	Use an array for options, as shown above.
+
+The five reserved indexes are:
+
+-  **id** - Each product in your store must have a unique identifier.
+   Typically this will be an "sku" or other such identifier.
+-  **qty** - The quantity being purchased.
+-  **price** - The price of the item.
+-  **name** - The name of the item.
+-  **options** - Any additional attributes that are needed to identify
+   the product. These must be passed via an array.
+
+In addition to the five indexes above, there are two reserved words:
+rowid and subtotal. These are used internally by the Cart class, so
+please do NOT use those words as index names when inserting data into
+the cart.
+
+Your array may contain additional data. Anything you include in your
+array will be stored in the session. However, it is best to standardize
+your data among all your products in order to make displaying the
+information in a table easier.
+
+The insert() method will return the $rowid if you successfully insert a
+single item.
+
+Adding Multiple Items to The Cart
+=================================
+
+By using a multi-dimensional array, as shown below, it is possible to
+add multiple products to the cart in one action. This is useful in cases
+where you wish to allow people to select from among several items on the
+same page.
+
+::
+
+	$data = array(
+		 array(
+			'id'	  => 'sku_123ABC',
+			'qty'	 => 1,
+			'price'   => 39.95,
+			'name'	=> 'T-Shirt',
+			'options' => array('Size' => 'L', 'Color' => 'Red')
+		),
+		 array(
+			'id'	  => 'sku_567ZYX',
+			'qty'	 => 1,
+			'price'   => 9.95,
+			'name'	=> 'Coffee Mug'
+		),
+		 array(
+			'id'	  => 'sku_965QRS',
+			'qty'	 => 1,
+			'price'   => 29.95,
+			'name'	=> 'Shot Glass'
+		)
+	);
+
+	$this->cart->insert($data);
+
+Displaying the Cart
+===================
+
+To display the cart you will create a :doc:`view
+file </general/views>` with code similar to the one shown below.
+
+Please note that this example uses the :doc:`form
+helper </helpers/form_helper>`.
+
+::
+
+	<?php echo form_open('path/to/controller/update/function'); ?>
+
+	<table cellpadding="6" cellspacing="1" style="width:100%" border="0">
+
+	<tr>
+	  <th>QTY</th>
+	  <th>Item Description</th>
+	  <th style="text-align:right">Item Price</th>
+	  <th style="text-align:right">Sub-Total</th>
+	</tr>
+
+	<?php $i = 1; ?>
+
+	<?php foreach ($this->cart->contents() as $items): ?>
+
+		<?php echo form_hidden($i.'[rowid]', $items['rowid']); ?>
+
+		<tr>
+		  <td><?php echo form_input(array('name' => $i.'[qty]', 'value' => $items['qty'], 'maxlength' => '3', 'size' => '5')); ?></td>
+		  <td>
+			<?php echo $items['name']; ?>
+
+				<?php if ($this->cart->has_options($items['rowid']) == TRUE): ?>
+
+					<p>
+						<?php foreach ($this->cart->product_options($items['rowid']) as $option_name => $option_value): ?>
+
+							<strong><?php echo $option_name; ?>:</strong> <?php echo $option_value; ?><br />
+
+						<?php endforeach; ?>
+					</p>
+
+				<?php endif; ?>
+
+		  </td>
+		  <td style="text-align:right"><?php echo $this->cart->format_number($items['price']); ?></td>
+		  <td style="text-align:right">$<?php echo $this->cart->format_number($items['subtotal']); ?></td>
+		</tr>
+
+	<?php $i++; ?>
+
+	<?php endforeach; ?>
+
+	<tr>
+	  <td colspan="2"> </td>
+	  <td class="right"><strong>Total</strong></td>
+	  <td class="right">$<?php echo $this->cart->format_number($this->cart->total()); ?></td>
+	</tr>
+
+	</table>
+
+	<p><?php echo form_submit('', 'Update your Cart'); ?></p>
+	
+Updating The Cart
+=================
+
+To update the information in your cart, you must pass an array
+containing the Row ID and quantity to the $this->cart->update()
+function:
+
+.. note:: If the quantity is set to zero, the item will be removed from
+	the cart.
+
+::
+
+	$data = array(
+		'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
+		'qty'   => 3
+	);
+
+	$this->cart->update($data); 
+
+	// Or a multi-dimensional array
+
+	$data = array(
+		array(
+		   'rowid'   => 'b99ccdf16028f015540f341130b6d8ec',
+		   'qty'     => 3
+		),
+		array(
+		   'rowid'   => 'xw82g9q3r495893iajdh473990rikw23',
+		   'qty'     => 4
+		),
+		array(
+		   'rowid'   => 'fh4kdkkkaoe30njgoe92rkdkkobec333',
+		   'qty'     => 2
+		)
+	);
+
+	$this->cart->update($data); 
+
+What is a Row ID?
+*****************
+
+The row ID is a unique identifier that is
+generated by the cart code when an item is added to the cart. The reason
+a unique ID is created is so that identical products with different
+options can be managed by the cart.
+
+For example, let's say someone buys two identical t-shirts (same product
+ID), but in different sizes. The product ID (and other attributes) will
+be identical for both sizes because it's the same shirt. The only
+difference will be the size. The cart must therefore have a means of
+identifying this difference so that the two sizes of shirts can be
+managed independently. It does so by creating a unique "row ID" based on
+the product ID and any options associated with it.
+
+In nearly all cases, updating the cart will be something the user does
+via the "view cart" page, so as a developer, it is unlikely that you
+will ever have to concern yourself with the "row ID", other then making
+sure your "view cart" page contains this information in a hidden form
+field, and making sure it gets passed to the update function when the
+update form is submitted. Please examine the construction of the "view
+cart" page above for more information.
+
+
+Function Reference
+==================
+
+$this->cart->insert();
+**********************
+
+Permits you to add items to the shopping cart, as outlined above.
+
+$this->cart->update();
+**********************
+
+Permits you to update items in the shopping cart, as outlined above.
+
+$this->cart->total();
+*********************
+
+Displays the total amount in the cart.
+
+$this->cart->total_items();
+****************************
+
+Displays the total number of items in the cart.
+
+$this->cart->contents();
+************************
+
+Returns an array containing everything in the cart.
+
+$this->cart->has_options(rowid);
+*********************************
+
+Returns TRUE (boolean) if a particular row in the cart contains options.
+This function is designed to be used in a loop with
+$this->cart->contents(), since you must pass the rowid to this function,
+as shown in the Displaying the Cart example above.
+
+$this->cart->product_options(rowid);
+*************************************
+
+Returns an array of options for a particular product. This function is
+designed to be used in a loop with $this->cart->contents(), since you
+must pass the rowid to this function, as shown in the Displaying the
+Cart example above.
+
+$this->cart->destroy();
+***********************
+
+Permits you to destroy the cart. This function will likely be called
+when you are finished processing the customer's order.
diff --git a/user_guide_src/source/libraries/config.rst b/user_guide_src/source/libraries/config.rst
new file mode 100644
index 0000000..c81cad7
--- /dev/null
+++ b/user_guide_src/source/libraries/config.rst
@@ -0,0 +1,181 @@
+############
+Config Class
+############
+
+The Config class provides a means to retrieve configuration preferences.
+These preferences can come from the default config file
+(application/config/config.php) or from your own custom config files.
+
+.. note:: This class is initialized automatically by the system so there
+	is no need to do it manually.
+
+.. contents:: Page Contents
+
+Anatomy of a Config File
+========================
+
+By default, CodeIgniter has one primary config file, located at
+application/config/config.php. If you open the file using your text
+editor you'll see that config items are stored in an array called
+$config.
+
+You can add your own config items to this file, or if you prefer to keep
+your configuration items separate (assuming you even need config items),
+simply create your own file and save it in config folder.
+
+.. note:: If you do create your own config files use the same format as
+	the primary one, storing your items in an array called $config.
+	CodeIgniter will intelligently manage these files so there will be no
+	conflict even though the array has the same name (assuming an array
+	index is not named the same as another).
+
+Loading a Config File
+=====================
+
+.. note::
+	CodeIgniter automatically loads the primary config file
+	(application/config/config.php), so you will only need to load a config
+	file if you have created your own.
+
+There are two ways to load a config file:
+
+Manual Loading
+**************
+
+To load one of your custom config files you will use the following
+function within the :doc:`controller </general/controllers>` that
+needs it::
+
+	$this->config->load('filename');
+
+Where filename is the name of your config file, without the .php file
+extension.
+
+If you need to load multiple config files normally they will be
+merged into one master config array. Name collisions can occur,
+however, if you have identically named array indexes in different
+config files. To avoid collisions you can set the second parameter to
+TRUE and each config file will be stored in an array index
+corresponding to the name of the config file. Example::
+
+	// Stored in an array with this prototype: $this->config['blog_settings'] = $config
+	$this->config->load('blog_settings', TRUE);
+
+Please see the section entitled Fetching Config Items below to learn
+how to retrieve config items set this way.
+
+The third parameter allows you to suppress errors in the event that a
+config file does not exist::
+
+	$this->config->load('blog_settings', FALSE, TRUE);
+
+Auto-loading
+************
+
+If you find that you need a particular config file globally, you can
+have it loaded automatically by the system. To do this, open the
+**autoload.php** file, located at application/config/autoload.php,
+and add your config file as indicated in the file.
+
+
+Fetching Config Items
+=====================
+
+To retrieve an item from your config file, use the following function::
+
+	$this->config->item('item name');
+
+Where item name is the $config array index you want to retrieve. For
+example, to fetch your language choice you'll do this::
+
+	$lang = $this->config->item('language');
+
+The function returns FALSE (boolean) if the item you are trying to fetch
+does not exist.
+
+If you are using the second parameter of the $this->config->load
+function in order to assign your config items to a specific index you
+can retrieve it by specifying the index name in the second parameter of
+the $this->config->item() function. Example::
+
+	// Loads a config file named blog_settings.php and assigns it to an index named "blog_settings"
+	$this->config->load('blog_settings', TRUE);
+
+	// Retrieve a config item named site_name contained within the blog_settings array
+	$site_name = $this->config->item('site_name', 'blog_settings');
+
+	// An alternate way to specify the same item:
+	$blog_config = $this->config->item('blog_settings');
+	$site_name = $blog_config['site_name'];
+
+Setting a Config Item
+=====================
+
+If you would like to dynamically set a config item or change an existing
+one, you can do so using::
+
+	$this->config->set_item('item_name', 'item_value');
+
+Where item_name is the $config array index you want to change, and
+item_value is its value.
+
+.. _config-environments:
+
+Environments
+============
+
+You may load different configuration files depending on the current
+environment. The ENVIRONMENT constant is defined in index.php, and is
+described in detail in the :doc:`Handling
+Environments </general/environments>` section.
+
+To create an environment-specific configuration file, create or copy a
+configuration file in application/config/{ENVIRONMENT}/{FILENAME}.php
+
+For example, to create a production-only config.php, you would:
+
+#. Create the directory application/config/production/
+#. Copy your existing config.php into the above directory
+#. Edit application/config/production/config.php so it contains your
+   production settings
+
+When you set the ENVIRONMENT constant to 'production', the settings for
+your new production-only config.php will be loaded.
+
+You can place the following configuration files in environment-specific
+folders:
+
+-  Default CodeIgniter configuration files
+-  Your own custom configuration files
+
+.. note::
+	CodeIgniter always tries to load the configuration files for
+	the current environment first. If the file does not exist, the global
+	config file (i.e., the one in application/config/) is loaded. This means
+	you are not obligated to place **all** of your configuration files in an
+	environment folder − only the files that change per environment.
+
+Helper Functions
+================
+
+The config class has the following helper functions:
+
+$this->config->site_url();
+***************************
+
+This function retrieves the URL to your site, along with the "index"
+value you've specified in the config file.
+
+$this->config->base_url();
+***************************
+
+This function retrieves the URL to your site, plus an optional path such
+as to a stylesheet or image.
+
+The two functions above are normally accessed via the corresponding
+functions in the :doc:`URL Helper </helpers/url_helper>`.
+
+$this->config->system_url();
+*****************************
+
+This function retrieves the URL to your system folder.
diff --git a/user_guide_src/source/libraries/email.rst b/user_guide_src/source/libraries/email.rst
new file mode 100644
index 0000000..025d04b
--- /dev/null
+++ b/user_guide_src/source/libraries/email.rst
@@ -0,0 +1,269 @@
+###########
+Email Class
+###########
+
+CodeIgniter's robust Email Class supports the following features:
+
+-  Multiple Protocols: Mail, Sendmail, and SMTP
+-  TLS and SSL Encryption for SMTP
+-  Multiple recipients
+-  CC and BCCs
+-  HTML or Plaintext email
+-  Attachments
+-  Word wrapping
+-  Priorities
+-  BCC Batch Mode, enabling large email lists to be broken into small
+   BCC batches.
+-  Email Debugging tools
+
+Sending Email
+=============
+
+Sending email is not only simple, but you can configure it on the fly or
+set your preferences in a config file.
+
+Here is a basic example demonstrating how you might send email. Note:
+This example assumes you are sending the email from one of your
+:doc:`controllers <../general/controllers>`.
+
+::
+
+	$this->load->library('email');  $this->email->from('your@example.com', 'Your Name'); $this->email->to('someone@example.com');  $this->email->cc('another@another-example.com');  $this->email->bcc('them@their-example.com');   $this->email->subject('Email Test'); $this->email->message('Testing the email class.');    $this->email->send();  echo $this->email->print_debugger();
+
+Setting Email Preferences
+=========================
+
+There are 17 different preferences available to tailor how your email
+messages are sent. You can either set them manually as described here,
+or automatically via preferences stored in your config file, described
+below:
+
+Preferences are set by passing an array of preference values to the
+email initialize function. Here is an example of how you might set some
+preferences::
+
+	$config['protocol'] = 'sendmail'; $config['mailpath'] = '/usr/sbin/sendmail'; $config['charset'] = 'iso-8859-1'; $config['wordwrap'] = TRUE;  $this->email->initialize($config);
+
+.. note:: Most of the preferences have default values that will be used
+	if you do not set them.
+
+Setting Email Preferences in a Config File
+------------------------------------------
+
+If you prefer not to set preferences using the above method, you can
+instead put them into a config file. Simply create a new file called the
+email.php, add the $config array in that file. Then save the file at
+config/email.php and it will be used automatically. You will NOT need to
+use the $this->email->initialize() function if you save your preferences
+in a config file.
+
+Email Preferences
+=================
+
+The following is a list of all the preferences that can be set when
+sending email.
+
+Preference
+Default Value
+Options
+Description
+**useragent**
+CodeIgniter
+None
+The "user agent".
+**protocol**
+mail
+mail, sendmail, or smtp
+The mail sending protocol.
+**mailpath**
+/usr/sbin/sendmail
+None
+The server path to Sendmail.
+**smtp_host**
+No Default
+None
+SMTP Server Address.
+**smtp_user**
+No Default
+None
+SMTP Username.
+**smtp_pass**
+No Default
+None
+SMTP Password.
+**smtp_port**
+25
+None
+SMTP Port.
+**smtp_timeout**
+5
+None
+SMTP Timeout (in seconds).
+**smtp_crypto**
+No Default
+tls or ssl
+SMTP Encryption
+**wordwrap**
+TRUE
+TRUE or FALSE (boolean)
+Enable word-wrap.
+**wrapchars**
+76
+Character count to wrap at.
+**mailtype**
+text
+text or html
+Type of mail. If you send HTML email you must send it as a complete web
+page. Make sure you don't have any relative links or relative image
+paths otherwise they will not work.
+**charset**
+utf-8
+Character set (utf-8, iso-8859-1, etc.).
+**validate**
+FALSE
+TRUE or FALSE (boolean)
+Whether to validate the email address.
+**priority**
+3
+1, 2, 3, 4, 5
+Email Priority. 1 = highest. 5 = lowest. 3 = normal.
+**crlf**
+\\n
+"\\r\\n" or "\\n" or "\\r"
+Newline character. (Use "\\r\\n" to comply with RFC 822).
+**newline**
+\\n
+"\\r\\n" or "\\n" or "\\r"
+Newline character. (Use "\\r\\n" to comply with RFC 822).
+**bcc_batch_mode**
+FALSE
+TRUE or FALSE (boolean)
+Enable BCC Batch Mode.
+**bcc_batch_size**
+200
+None
+Number of emails in each BCC batch.
+Email Function Reference
+========================
+
+$this->email->from()
+--------------------
+
+Sets the email address and name of the person sending the email::
+
+	$this->email->from('you@example.com', 'Your Name');
+
+$this->email->reply_to()
+-------------------------
+
+Sets the reply-to address. If the information is not provided the
+information in the "from" function is used. Example::
+
+	$this->email->reply_to('you@example.com', 'Your Name');
+
+$this->email->to()
+------------------
+
+Sets the email address(s) of the recipient(s). Can be a single email, a
+comma-delimited list or an array::
+
+	$this->email->to('someone@example.com');
+
+::
+
+	$this->email->to('one@example.com, two@example.com, three@example.com');
+
+::
+
+	$list = array('one@example.com', 'two@example.com', 'three@example.com');  $this->email->to($list);
+
+$this->email->cc()
+------------------
+
+Sets the CC email address(s). Just like the "to", can be a single email,
+a comma-delimited list or an array.
+
+$this->email->bcc()
+-------------------
+
+Sets the BCC email address(s). Just like the "to", can be a single
+email, a comma-delimited list or an array.
+
+$this->email->subject()
+-----------------------
+
+Sets the email subject::
+
+	$this->email->subject('This is my subject');
+
+$this->email->message()
+-----------------------
+
+Sets the email message body::
+
+	$this->email->message('This is my message');
+
+$this->email->set_alt_message()
+---------------------------------
+
+Sets the alternative email message body::
+
+	$this->email->set_alt_message('This is the alternative message');
+
+This is an optional message string which can be used if you send HTML
+formatted email. It lets you specify an alternative message with no HTML
+formatting which is added to the header string for people who do not
+accept HTML email. If you do not set your own message CodeIgniter will
+extract the message from your HTML email and strip the tags.
+
+$this->email->clear()
+---------------------
+
+Initializes all the email variables to an empty state. This function is
+intended for use if you run the email sending function in a loop,
+permitting the data to be reset between cycles.
+
+::
+
+	foreach ($list as $name => $address) {     $this->email->clear();      $this->email->to($address);     $this->email->from('your@example.com');     $this->email->subject('Here is your info '.$name);     $this->email->message('Hi '.$name.' Here is the info you requested.');     $this->email->send(); }
+
+If you set the parameter to TRUE any attachments will be cleared as
+well::
+
+	$this->email->clear(TRUE);
+
+$this->email->send()
+--------------------
+
+The Email sending function. Returns boolean TRUE or FALSE based on
+success or failure, enabling it to be used conditionally::
+
+	if ( ! $this->email->send()) {     // Generate error }
+
+$this->email->attach()
+----------------------
+
+Enables you to send an attachment. Put the file path/name in the first
+parameter. Note: Use a file path, not a URL. For multiple attachments
+use the function multiple times. For example::
+
+	$this->email->attach('/path/to/photo1.jpg'); $this->email->attach('/path/to/photo2.jpg'); $this->email->attach('/path/to/photo3.jpg');  $this->email->send();
+
+$this->email->print_debugger()
+-------------------------------
+
+Returns a string containing any server messages, the email headers, and
+the email messsage. Useful for debugging.
+
+Overriding Word Wrapping
+========================
+
+If you have word wrapping enabled (recommended to comply with RFC 822)
+and you have a very long link in your email it can get wrapped too,
+causing it to become un-clickable by the person receiving it.
+CodeIgniter lets you manually override word wrapping within part of your
+message like this::
+
+	The text of your email that gets wrapped normally.  {unwrap}http://example.com/a_long_link_that_should_not_be_wrapped.html{/unwrap}  More text that will be wrapped normally.
+
+Place the item you do not want word-wrapped between: {unwrap} {/unwrap}
diff --git a/user_guide_src/source/libraries/encryption.rst b/user_guide_src/source/libraries/encryption.rst
new file mode 100644
index 0000000..27c6a64
--- /dev/null
+++ b/user_guide_src/source/libraries/encryption.rst
@@ -0,0 +1,173 @@
+################
+Encryption Class
+################
+
+The Encryption Class provides two-way data encryption. It uses a scheme
+that either compiles the message using a randomly hashed bitwise XOR
+encoding scheme, or is encrypted using the Mcrypt library. If Mcrypt is
+not available on your server the encoded message will still provide a
+reasonable degree of security for encrypted sessions or other such
+"light" purposes. If Mcrypt is available, you'll be provided with a high
+degree of security appropriate for storage.
+
+Setting your Key
+================
+
+A *key* is a piece of information that controls the cryptographic
+process and permits an encrypted string to be decoded. In fact, the key
+you chose will provide the **only** means to decode data that was
+encrypted with that key, so not only must you choose the key carefully,
+you must never change it if you intend use it for persistent data.
+
+It goes without saying that you should guard your key carefully. Should
+someone gain access to your key, the data will be easily decoded. If
+your server is not totally under your control it's impossible to ensure
+key security so you may want to think carefully before using it for
+anything that requires high security, like storing credit card numbers.
+
+To take maximum advantage of the encryption algorithm, your key should
+be 32 characters in length (128 bits). The key should be as random a
+string as you can concoct, with numbers and uppercase and lowercase
+letters. Your key should **not** be a simple text string. In order to be
+cryptographically secure it needs to be as random as possible.
+
+Your key can be either stored in your application/config/config.php, or
+you can design your own storage mechanism and pass the key dynamically
+when encoding/decoding.
+
+To save your key to your application/config/config.php, open the file
+and set::
+
+	$config['encryption_key'] = "YOUR KEY";
+
+Message Length
+==============
+
+It's important for you to know that the encoded messages the encryption
+function generates will be approximately 2.6 times longer than the
+original message. For example, if you encrypt the string "my super
+secret data", which is 21 characters in length, you'll end up with an
+encoded string that is roughly 55 characters (we say "roughly" because
+the encoded string length increments in 64 bit clusters, so it's not
+exactly linear). Keep this information in mind when selecting your data
+storage mechanism. Cookies, for example, can only hold 4K of
+information.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the Encryption class is
+initialized in your controller using the $this->load->library function::
+
+	$this->load->library('encrypt');
+
+Once loaded, the Encrypt library object will be available using:
+$this->encrypt
+
+$this->encrypt->encode()
+========================
+
+Performs the data encryption and returns it as a string. Example::
+
+	 $msg = 'My secret message';  $encrypted_string = $this->encrypt->encode($msg);
+
+You can optionally pass your encryption key via the second parameter if
+you don't want to use the one in your config file::
+
+	 $msg = 'My secret message'; $key = 'super-secret-key';  $encrypted_string = $this->encrypt->encode($msg, $key);
+
+$this->encrypt->decode()
+========================
+
+Decrypts an encoded string. Example::
+
+	 $encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';  $plaintext_string = $this->encrypt->decode($encrypted_string);
+
+You can optionally pass your encryption key via the second parameter if
+you don't want to use the one in your config file::
+
+	 $msg = 'My secret message'; $key = 'super-secret-key';  $encrypted_string = $this->encrypt->decode($msg, $key);
+
+$this->encrypt->set_cipher();
+==============================
+
+Permits you to set an Mcrypt cipher. By default it uses
+MCRYPT_RIJNDAEL_256. Example::
+
+	$this->encrypt->set_cipher(MCRYPT_BLOWFISH);
+
+Please visit php.net for a list of `available
+ciphers <http://php.net/mcrypt>`_.
+
+If you'd like to manually test whether your server supports Mcrypt you
+can use::
+
+	echo ( ! function_exists('mcrypt_encrypt')) ? 'Nope' : 'Yup';
+
+$this->encrypt->set_mode();
+============================
+
+Permits you to set an Mcrypt mode. By default it uses MCRYPT_MODE_CBC.
+Example::
+
+	$this->encrypt->set_mode(MCRYPT_MODE_CFB);
+
+Please visit php.net for a list of `available
+modes <http://php.net/mcrypt>`_.
+
+$this->encrypt->sha1();
+=======================
+
+SHA1 encoding function. Provide a string and it will return a 160 bit
+one way hash. Note: SHA1, just like MD5 is non-decodable. Example::
+
+	$hash = $this->encrypt->sha1('Some string');
+
+Many PHP installations have SHA1 support by default so if all you need
+is to encode a hash it's simpler to use the native function::
+
+	$hash = sha1('Some string');
+
+If your server does not support SHA1 you can use the provided function.
+
+$this->encrypt->encode_from_legacy($orig_data, $legacy_mode =
+MCRYPT_MODE_ECB, $key = '');
+==============================
+
+Enables you to re-encode data that was originally encrypted with
+CodeIgniter 1.x to be compatible with the Encryption library in
+CodeIgniter 2.x. It is only necessary to use this method if you have
+encrypted data stored permanently such as in a file or database and are
+on a server that supports Mcrypt. "Light" use encryption such as
+encrypted session data or transitory encrypted flashdata require no
+intervention on your part. However, existing encrypted Sessions will be
+destroyed since data encrypted prior to 2.x will not be decoded.
+
+**Why only a method to re-encode the data instead of maintaining legacy
+methods for both encoding and decoding?** The algorithms in the
+Encryption library have improved in CodeIgniter 2.x both for performance
+and security, and we do not wish to encourage continued use of the older
+methods. You can of course extend the Encryption library if you wish and
+replace the new methods with the old and retain seamless compatibility
+with CodeIgniter 1.x encrypted data, but this a decision that a
+developer should make cautiously and deliberately, if at all.
+
+::
+
+	$new_data = $this->encrypt->encode_from_legacy($old_encrypted_string);
+
+Parameter
+Default
+Description
+**$orig_data**
+n/a
+The original encrypted data from CodeIgniter 1.x's Encryption library
+**$legacy_mode**
+MCRYPT_MODE_ECB
+The Mcrypt mode that was used to generate the original encrypted data.
+CodeIgniter 1.x's default was MCRYPT_MODE_ECB, and it will assume that
+to be the case unless overridden by this parameter.
+**$key**
+n/a
+The encryption key. This it typically specified in your config file as
+outlined above.
diff --git a/user_guide_src/source/libraries/file_uploading.rst b/user_guide_src/source/libraries/file_uploading.rst
new file mode 100644
index 0000000..c2de598
--- /dev/null
+++ b/user_guide_src/source/libraries/file_uploading.rst
@@ -0,0 +1,276 @@
+####################
+File Uploading Class
+####################
+
+CodeIgniter's File Uploading Class permits files to be uploaded. You can
+set various preferences, restricting the type and size of the files.
+
+***********
+The Process
+***********
+
+Uploading a file involves the following general process:
+
+-  An upload form is displayed, allowing a user to select a file and
+   upload it.
+-  When the form is submitted, the file is uploaded to the destination
+   you specify.
+-  Along the way, the file is validated to make sure it is allowed to be
+   uploaded based on the preferences you set.
+-  Once uploaded, the user will be shown a success message.
+
+To demonstrate this process here is brief tutorial. Afterward you'll
+find reference information.
+
+Creating the Upload Form
+========================
+
+Using a text editor, create a form called upload_form.php. In it, place
+this code and save it to your applications/views/ folder:
+
+<html> <head> <title>Upload Form</title> </head> <body> <?php echo
+$error;?> <?php echo form_open_multipart('upload/do_upload');?>
+<input type="file" name="userfile" size="20" /> <br /><br /> <input
+type="submit" value="upload" /> </form> </body> </html>
+You'll notice we are using a form helper to create the opening form tag.
+File uploads require a multipart form, so the helper creates the proper
+syntax for you. You'll also notice we have an $error variable. This is
+so we can show error messages in the event the user does something
+wrong.
+
+The Success Page
+================
+
+Using a text editor, create a form called upload_success.php. In it,
+place this code and save it to your applications/views/ folder:
+
+<html> <head> <title>Upload Form</title> </head> <body> <h3>Your file
+was successfully uploaded!</h3> <ul> <?php foreach ($upload_data as
+$item => $value):?> <li><?php echo $item;?>: <?php echo $value;?></li>
+<?php endforeach; ?> </ul> <p><?php echo anchor('upload', 'Upload
+Another File!'); ?></p> </body> </html>
+The Controller
+==============
+
+Using a text editor, create a controller called upload.php. In it, place
+this code and save it to your applications/controllers/ folder:
+
+<?php class Upload extends CI_Controller { function \__construct() {
+parent::\__construct(); $this->load->helper(array('form', 'url')); }
+function index() { $this->load->view('upload_form', array('error' => '
+' )); } function do_upload() { $config['upload_path'] = './uploads/';
+$config['allowed_types'] = 'gif\|jpg\|png'; $config['max_size'] =
+'100'; $config['max_width'] = '1024'; $config['max_height'] = '768';
+$this->load->library('upload', $config); if ( !
+$this->upload->do_upload()) { $error = array('error' =>
+$this->upload->display_errors()); $this->load->view('upload_form',
+$error); } else { $data = array('upload_data' =>
+$this->upload->data()); $this->load->view('upload_success', $data); } }
+} ?>
+
+The Upload Folder
+=================
+
+You'll need a destination folder for your uploaded images. Create a
+folder at the root of your CodeIgniter installation called uploads and
+set its file permissions to 777.
+
+Try it!
+=======
+
+To try your form, visit your site using a URL similar to this one::
+
+	example.com/index.php/upload/
+
+You should see an upload form. Try uploading an image file (either a
+jpg, gif, or png). If the path in your controller is correct it should
+work.
+
+***************
+Reference Guide
+***************
+
+Initializing the Upload Class
+=============================
+
+Like most other classes in CodeIgniter, the Upload class is initialized
+in your controller using the $this->load->library function::
+
+	$this->load->library('upload');
+
+Once the Upload class is loaded, the object will be available using:
+$this->upload
+
+Setting Preferences
+===================
+
+Similar to other libraries, you'll control what is allowed to be upload
+based on your preferences. In the controller you built above you set the
+following preferences::
+
+	$config['upload_path'] = './uploads/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '100'; $config['max_width']  = '1024'; $config['max_height']  = '768';  $this->load->library('upload', $config);  // Alternately you can set preferences by calling the initialize function.  Useful if you auto-load the class: $this->upload->initialize($config);
+
+The above preferences should be fairly self-explanatory. Below is a
+table describing all available preferences.
+
+Preferences
+===========
+
+The following preferences are available. The default value indicates
+what will be used if you do not specify that preference.
+
+Preference
+Default Value
+Options
+Description
+**upload_path**
+None
+None
+The path to the folder where the upload should be placed. The folder
+must be writable and the path can be absolute or relative.
+**allowed_types**
+None
+None
+The mime types corresponding to the types of files you allow to be
+uploaded. Usually the file extension can be used as the mime type.
+Separate multiple types with a pipe.
+**file_name**
+None
+Desired file name
+If set CodeIgniter will rename the uploaded file to this name. The
+extension provided in the file name must also be an allowed file type.
+
+**overwrite**
+FALSE
+TRUE/FALSE (boolean)
+If set to true, if a file with the same name as the one you are
+uploading exists, it will be overwritten. If set to false, a number will
+be appended to the filename if another with the same name exists.
+**max_size**
+0
+None
+The maximum size (in kilobytes) that the file can be. Set to zero for no
+limit. Note: Most PHP installations have their own limit, as specified
+in the php.ini file. Usually 2 MB (or 2048 KB) by default.
+**max_width**
+0
+None
+The maximum width (in pixels) that the file can be. Set to zero for no
+limit.
+**max_height**
+0
+None
+The maximum height (in pixels) that the file can be. Set to zero for no
+limit.
+**max_filename**
+0
+None
+The maximum length that a file name can be. Set to zero for no limit.
+**max_filename_increment**
+100
+None
+When overwrite is set to FALSE, use this to set the maximum filename
+increment for CodeIgniter to append to the filename.
+**encrypt_name**
+FALSE
+TRUE/FALSE (boolean)
+If set to TRUE the file name will be converted to a random encrypted
+string. This can be useful if you would like the file saved with a name
+that can not be discerned by the person uploading it.
+**remove_spaces**
+TRUE
+TRUE/FALSE (boolean)
+If set to TRUE, any spaces in the file name will be converted to
+underscores. This is recommended.
+
+Setting preferences in a config file
+====================================
+
+If you prefer not to set preferences using the above method, you can
+instead put them into a config file. Simply create a new file called the
+upload.php, add the $config array in that file. Then save the file in:
+config/upload.php and it will be used automatically. You will NOT need
+to use the $this->upload->initialize function if you save your
+preferences in a config file.
+
+******************
+Function Reference
+******************
+
+The following functions are available
+
+$this->upload->do_upload()
+===========================
+
+Performs the upload based on the preferences you've set. Note: By
+default the upload routine expects the file to come from a form field
+called userfile, and the form must be a "multipart type::
+
+	<form method="post" action="some_action" enctype="multipart/form-data" />
+
+If you would like to set your own field name simply pass its value to
+the do_upload function::
+
+	 $field_name = "some_field_name"; $this->upload->do_upload($field_name)
+
+$this->upload->display_errors()
+================================
+
+Retrieves any error messages if the do_upload() function returned
+false. The function does not echo automatically, it returns the data so
+you can assign it however you need.
+
+Formatting Errors
+*****************
+
+By default the above function wraps any errors within <p> tags. You can
+set your own delimiters like this::
+
+	$this->upload->display_errors('<p>', '</p>');
+
+$this->upload->data()
+=====================
+
+This is a helper function that returns an array containing all of the
+data related to the file you uploaded. Here is the array prototype::
+
+	Array (     [file_name]    => mypic.jpg     [file_type]    => image/jpeg     [file_path]    => /path/to/your/upload/     [full_path]    => /path/to/your/upload/jpg.jpg     [raw_name]     => mypic     [orig_name]    => mypic.jpg     [client_name]  => mypic.jpg     [file_ext]     => .jpg     [file_size]    => 22.2     [is_image]     => 1     [image_width]  => 800     [image_height] => 600     [image_type]   => jpeg     [image_size_str] => width="800" height="200" )
+
+Explanation
+***********
+
+Here is an explanation of the above array items.
+
+Item
+Description
+**file_name**
+The name of the file that was uploaded including the file extension.
+**file_type**
+The file's Mime type
+**file_path**
+The absolute server path to the file
+**full_path**
+The absolute server path including the file name
+**raw_name**
+The file name without the extension
+**orig_name**
+The original file name. This is only useful if you use the encrypted
+name option.
+**client_name**
+The file name as supplied by the client user agent, prior to any file
+name preparation or incrementing.
+**file_ext**
+The file extension with period
+**file_size**
+The file size in kilobytes
+**is_image**
+Whether the file is an image or not. 1 = image. 0 = not.
+**image_width**
+Image width.
+**image_height**
+Image height
+**image_type**
+Image type. Typically the file extension without the period.
+**image_size_str**
+A string containing the width and height. Useful to put into an image
+tag.
diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst
new file mode 100644
index 0000000..b856807
--- /dev/null
+++ b/user_guide_src/source/libraries/form_validation.rst
@@ -0,0 +1,813 @@
+###############
+Form Validation
+###############
+
+CodeIgniter provides a comprehensive form validation and data prepping
+class that helps minimize the amount of code you'll write.
+
+-  `Overview <#overview>`_
+-  `Form Validation Tutorial <#tutorial>`_
+
+   -  `The Form <#theform>`_
+   -  `The Success Page <#thesuccesspage>`_
+   -  `The Controller <#thecontroller>`_
+   -  `Setting Validation Rules <#validationrules>`_
+   -  `Setting Validation Rules Using an
+      Array <#validationrulesasarray>`_
+   -  `Cascading Rules <#cascadingrules>`_
+   -  `Prepping Data <#preppingdata>`_
+   -  `Re-populating the Form <#repopulatingform>`_
+   -  `Callbacks <#callbacks>`_
+   -  `Setting Error Messages <#settingerrors>`_
+   -  `Changing the Error Delimiters <#errordelimiters>`_
+   -  `Translating Field Names <#translatingfn>`_
+   -  `Showing Errors Individually <#individualerrors>`_
+   -  `Saving Sets of Validation Rules to a Config
+      File <#savingtoconfig>`_
+   -  `Using Arrays as Field Names <#arraysasfields>`_
+
+-  `Rule Reference <#rulereference>`_
+-  `Prepping Reference <#preppingreference>`_
+-  `Function Reference <#functionreference>`_
+-  `Helper Reference <#helperreference>`_
+
+********
+Overview
+********
+
+Before explaining CodeIgniter's approach to data validation, let's
+describe the ideal scenario:
+
+#. A form is displayed.
+#. You fill it in and submit it.
+#. If you submitted something invalid, or perhaps missed a required
+   item, the form is redisplayed containing your data along with an
+   error message describing the problem.
+#. This process continues until you have submitted a valid form.
+
+On the receiving end, the script must:
+
+#. Check for required data.
+#. Verify that the data is of the correct type, and meets the correct
+   criteria. For example, if a username is submitted it must be
+   validated to contain only permitted characters. It must be of a
+   minimum length, and not exceed a maximum length. The username can't
+   be someone else's existing username, or perhaps even a reserved word.
+   Etc.
+#. Sanitize the data for security.
+#. Pre-format the data if needed (Does the data need to be trimmed? HTML
+   encoded? Etc.)
+#. Prep the data for insertion in the database.
+
+Although there is nothing terribly complex about the above process, it
+usually requires a significant amount of code, and to display error
+messages, various control structures are usually placed within the form
+HTML. Form validation, while simple to create, is generally very messy
+and tedious to implement.
+
+************************
+Form Validation Tutorial
+************************
+
+What follows is a "hands on" tutorial for implementing CodeIgniters Form
+Validation.
+
+In order to implement form validation you'll need three things:
+
+#. A :doc:`View <../general/views>` file containing a form.
+#. A View file containing a "success" message to be displayed upon
+   successful submission.
+#. A :doc:`controller <../general/controllers>` function to receive and
+   process the submitted data.
+
+Let's create those three things, using a member sign-up form as the
+example.
+
+The Form
+========
+
+Using a text editor, create a form called myform.php. In it, place this
+code and save it to your applications/views/ folder:
+
+<html> <head> <title>My Form</title> </head> <body> <?php echo
+validation_errors(); ?> <?php echo form_open('form'); ?>
+<h5>Username</h5> <input type="text" name="username" value="" size="50"
+/> <h5>Password</h5> <input type="text" name="password" value=""
+size="50" /> <h5>Password Confirm</h5> <input type="text"
+name="passconf" value="" size="50" /> <h5>Email Address</h5> <input
+type="text" name="email" value="" size="50" /> <div><input type="submit"
+value="Submit" /></div> </form> </body> </html>
+
+The Success Page
+================
+
+Using a text editor, create a form called formsuccess.php. In it, place
+this code and save it to your applications/views/ folder:
+
+<html> <head> <title>My Form</title> </head> <body> <h3>Your form was
+successfully submitted!</h3> <p><?php echo anchor('form', 'Try it
+again!'); ?></p> </body> </html>
+
+The Controller
+==============
+
+Using a text editor, create a controller called form.php. In it, place
+this code and save it to your applications/controllers/ folder:
+
+<?php class Form extends CI_Controller { function index() {
+$this->load->helper(array('form', 'url'));
+$this->load->library('form_validation'); if
+($this->form_validation->run() == FALSE) { $this->load->view('myform');
+} else { $this->load->view('formsuccess'); } } } ?>
+
+Try it!
+=======
+
+To try your form, visit your site using a URL similar to this one::
+
+	example.com/index.php/form/
+
+If you submit the form you should simply see the form reload. That's
+because you haven't set up any validation rules yet.
+
+**Since you haven't told the Form Validation class to validate anything
+yet, it returns FALSE (boolean false) by default. The run() function
+only returns TRUE if it has successfully applied your rules without any
+of them failing.**
+
+Explanation
+===========
+
+You'll notice several things about the above pages:
+
+The form (myform.php) is a standard web form with a couple exceptions:
+
+#. It uses a form helper to create the form opening. Technically, this
+   isn't necessary. You could create the form using standard HTML.
+   However, the benefit of using the helper is that it generates the
+   action URL for you, based on the URL in your config file. This makes
+   your application more portable in the event your URLs change.
+#. At the top of the form you'll notice the following function call:
+   ::
+
+	<?php echo validation_errors(); ?>
+
+   This function will return any error messages sent back by the
+   validator. If there are no messages it returns an empty string.
+
+The controller (form.php) has one function: index(). This function
+initializes the validation class and loads the form helper and URL
+helper used by your view files. It also runs the validation routine.
+Based on whether the validation was successful it either presents the
+form or the success page.
+
+Setting Validation Rules
+========================
+
+CodeIgniter lets you set as many validation rules as you need for a
+given field, cascading them in order, and it even lets you prep and
+pre-process the field data at the same time. To set validation rules you
+will use the set_rules() function::
+
+	$this->form_validation->set_rules();
+
+The above function takes **three** parameters as input:
+
+#. The field name - the exact name you've given the form field.
+#. A "human" name for this field, which will be inserted into the error
+   message. For example, if your field is named "user" you might give it
+   a human name of "Username".
+#. The validation rules for this form field.
+
+.. note:: If you would like the field
+	name to be stored in a language file, please see `Translating Field
+	Names <#translatingfn>`_.
+
+Here is an example. In your controller (form.php), add this code just
+below the validation initialization function::
+
+	 $this->form_validation->set_rules('username', 'Username', 'required'); $this->form_validation->set_rules('password', 'Password', 'required'); $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required'); $this->form_validation->set_rules('email', 'Email', 'required');
+
+Your controller should now look like this:
+
+<?php class Form extends CI_Controller { function index() {
+$this->load->helper(array('form', 'url'));
+$this->load->library('form_validation');
+$this->form_validation->set_rules('username', 'Username', 'required');
+$this->form_validation->set_rules('password', 'Password', 'required');
+$this->form_validation->set_rules('passconf', 'Password Confirmation',
+'required'); $this->form_validation->set_rules('email', 'Email',
+'required'); if ($this->form_validation->run() == FALSE) {
+$this->load->view('myform'); } else { $this->load->view('formsuccess');
+} } } ?>
+
+Now submit the form with the fields blank and you should see the error
+messages. If you submit the form with all the fields populated you'll
+see your success page.
+
+.. note:: The form fields are not yet being re-populated with the data
+	when there is an error. We'll get to that shortly.
+
+Setting Rules Using an Array
+============================
+
+Before moving on it should be noted that the rule setting function can
+be passed an array if you prefer to set all your rules in one action. If
+you use this approach you must name your array keys as indicated::
+
+	 $config = array(                array(                      'field'   => 'username',                       'label'   => 'Username',                       'rules'   => 'required'                   ),                array(                      'field'   => 'password',                       'label'   => 'Password',                       'rules'   => 'required'                   ),                array(                      'field'   => 'passconf',                       'label'   => 'Password Confirmation',                       'rules'   => 'required'                   ),                   array(                      'field'   => 'email',                       'label'   => 'Email',                       'rules'   => 'required'                   )             );  $this->form_validation->set_rules($config);
+
+Cascading Rules
+===============
+
+CodeIgniter lets you pipe multiple rules together. Let's try it. Change
+your rules in the third parameter of rule setting function, like this::
+
+	 $this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]|is_unique[users.username]'); $this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]'); $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required'); $this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');
+
+The above code sets the following rules:
+
+#. The username field be no shorter than 5 characters and no longer than
+   12.
+#. The password field must match the password confirmation field.
+#. The email field must contain a valid email address.
+
+Give it a try! Submit your form without the proper data and you'll see
+new error messages that correspond to your new rules. There are numerous
+rules available which you can read about in the validation reference.
+
+Prepping Data
+=============
+
+In addition to the validation functions like the ones we used above, you
+can also prep your data in various ways. For example, you can set up
+rules like this::
+
+	 $this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]|xss_clean'); $this->form_validation->set_rules('password', 'Password', 'trim|required|matches[passconf]|md5'); $this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required'); $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
+
+In the above example, we are "trimming" the fields, converting the
+password to MD5, and running the username through the "xss_clean"
+function, which removes malicious data.
+
+**Any native PHP function that accepts one parameter can be used as a
+rule, like htmlspecialchars, trim, MD5, etc.**
+
+.. note:: You will generally want to use the prepping functions
+	**after** the validation rules so if there is an error, the original
+	data will be shown in the form.
+
+Re-populating the form
+======================
+
+Thus far we have only been dealing with errors. It's time to repopulate
+the form field with the submitted data. CodeIgniter offers several
+helper functions that permit you to do this. The one you will use most
+commonly is::
+
+	set_value('field name')
+
+Open your myform.php view file and update the **value** in each field
+using the set_value() function:
+
+**Don't forget to include each field name in the set_value()
+functions!**
+
+<html> <head> <title>My Form</title> </head> <body> <?php echo
+validation_errors(); ?> <?php echo form_open('form'); ?>
+<h5>Username</h5> <input type="text" name="username" value="<?php echo
+set_value('username'); ?>" size="50" /> <h5>Password</h5> <input
+type="text" name="password" value="<?php echo set_value('password');
+?>" size="50" /> <h5>Password Confirm</h5> <input type="text"
+name="passconf" value="<?php echo set_value('passconf'); ?>" size="50"
+/> <h5>Email Address</h5> <input type="text" name="email" value="<?php
+echo set_value('email'); ?>" size="50" /> <div><input type="submit"
+value="Submit" /></div> </form> </body> </html>
+Now reload your page and submit the form so that it triggers an error.
+Your form fields should now be re-populated
+
+.. note:: The `Function Reference <#functionreference>`_ section below
+	contains functions that permit you to re-populate <select> menus, radio
+	buttons, and checkboxes.
+
+**Important Note:** If you use an array as the name of a form field, you
+must supply it as an array to the function. Example::
+
+	<input type="text" name="colors[]" value="<?php echo set_value('colors[]'); ?>" size="50" />
+
+For more info please see the `Using Arrays as Field
+Names <#arraysasfields>`_ section below.
+
+Callbacks: Your own Validation Functions
+========================================
+
+The validation system supports callbacks to your own validation
+functions. This permits you to extend the validation class to meet your
+needs. For example, if you need to run a database query to see if the
+user is choosing a unique username, you can create a callback function
+that does that. Let's create a example of this.
+
+In your controller, change the "username" rule to this::
+
+	$this->form_validation->set_rules('username', 'Username', 'callback_username_check');
+
+Then add a new function called username_check to your controller.
+Here's how your controller should now look:
+
+<?php class Form extends CI_Controller { public function index() {
+$this->load->helper(array('form', 'url'));
+$this->load->library('form_validation');
+$this->form_validation->set_rules('username', 'Username',
+'callback_username_check');
+$this->form_validation->set_rules('password', 'Password', 'required');
+$this->form_validation->set_rules('passconf', 'Password Confirmation',
+'required'); $this->form_validation->set_rules('email', 'Email',
+'required\|is_unique[users.email]'); if ($this->form_validation->run()
+== FALSE) { $this->load->view('myform'); } else {
+$this->load->view('formsuccess'); } } public function
+username_check($str) { if ($str == 'test') {
+$this->form_validation->set_message('username_check', 'The %s field
+can not be the word "test"'); return FALSE; } else { return TRUE; } } }
+?>
+Reload your form and submit it with the word "test" as the username. You
+can see that the form field data was passed to your callback function
+for you to process.
+
+To invoke a callback just put the function name in a rule, with
+"callback\_" as the rule **prefix**. If you need to receive an extra
+parameter in your callback function, just add it normally after the
+function name between square brackets, as in: "callback_foo**[bar]**",
+then it will be passed as the second argument of your callback function.
+
+.. note:: You can also process the form data that is passed to your
+	callback and return it. If your callback returns anything other than a
+	boolean TRUE/FALSE it is assumed that the data is your newly processed
+	form data.
+
+Setting Error Messages
+======================
+
+All of the native error messages are located in the following language
+file: language/english/form_validation_lang.php
+
+To set your own custom message you can either edit that file, or use the
+following function::
+
+	$this->form_validation->set_message('rule', 'Error Message');
+
+Where rule corresponds to the name of a particular rule, and Error
+Message is the text you would like displayed.
+
+If you include %s in your error string, it will be replaced with the
+"human" name you used for your field when you set your rules.
+
+In the "callback" example above, the error message was set by passing
+the name of the function::
+
+	$this->form_validation->set_message('username_check')
+
+You can also override any error message found in the language file. For
+example, to change the message for the "required" rule you will do this::
+
+	$this->form_validation->set_message('required', 'Your custom message here');
+
+Translating Field Names
+=======================
+
+If you would like to store the "human" name you passed to the
+set_rules() function in a language file, and therefore make the name
+able to be translated, here's how:
+
+First, prefix your "human" name with lang:, as in this example::
+
+	 $this->form_validation->set_rules('first_name', 'lang:first_name', 'required');
+
+Then, store the name in one of your language file arrays (without the
+prefix)::
+
+	$lang['first_name'] = 'First Name';
+
+.. note:: If you store your array item in a language file that is not
+	loaded automatically by CI, you'll need to remember to load it in your
+	controller using::
+
+	$this->lang->load('file_name');
+
+See the :doc:`Language Class <language>` page for more info regarding
+language files.
+
+Changing the Error Delimiters
+=============================
+
+By default, the Form Validation class adds a paragraph tag (<p>) around
+each error message shown. You can either change these delimiters
+globally or individually.
+
+#. **Changing delimiters Globally**
+   To globally change the error delimiters, in your controller function,
+   just after loading the Form Validation class, add this:
+
+   ::
+
+	$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
+
+   In this example, we've switched to using div tags.
+
+#. **Changing delimiters Individually**
+   Each of the two error generating functions shown in this tutorial can
+   be supplied their own delimiters as follows:
+
+   ::
+
+	<?php echo form_error('field name', '<div class="error">', '</div>'); ?>
+
+   Or:
+
+   ::
+
+	<?php echo validation_errors('<div class="error">', '</div>'); ?>
+
+
+Showing Errors Individually
+===========================
+
+If you prefer to show an error message next to each form field, rather
+than as a list, you can use the form_error() function.
+
+Try it! Change your form so that it looks like this:
+
+<h5>Username</h5> <?php echo form_error('username'); ?> <input
+type="text" name="username" value="<?php echo set_value('username');
+?>" size="50" /> <h5>Password</h5> <?php echo form_error('password');
+?> <input type="text" name="password" value="<?php echo
+set_value('password'); ?>" size="50" /> <h5>Password Confirm</h5> <?php
+echo form_error('passconf'); ?> <input type="text" name="passconf"
+value="<?php echo set_value('passconf'); ?>" size="50" /> <h5>Email
+Address</h5> <?php echo form_error('email'); ?> <input type="text"
+name="email" value="<?php echo set_value('email'); ?>" size="50" />
+If there are no errors, nothing will be shown. If there is an error, the
+message will appear.
+
+**Important Note:** If you use an array as the name of a form field, you
+must supply it as an array to the function. Example::
+
+	<?php echo form_error('options[size]'); ?> <input type="text" name="options[size]" value="<?php echo set_value("options[size]"); ?>" size="50" />
+
+For more info please see the `Using Arrays as Field
+Names <#arraysasfields>`_ section below.
+
+************************************************
+Saving Sets of Validation Rules to a Config File
+************************************************
+
+A nice feature of the Form Validation class is that it permits you to
+store all your validation rules for your entire application in a config
+file. You can organize these rules into "groups". These groups can
+either be loaded automatically when a matching controller/function is
+called, or you can manually call each set as needed.
+
+How to save your rules
+======================
+
+To store your validation rules, simply create a file named
+form_validation.php in your application/config/ folder. In that file
+you will place an array named $config with your rules. As shown earlier,
+the validation array will have this prototype::
+
+	 $config = array(                array(                      'field'   => 'username',                       'label'   => 'Username',                       'rules'   => 'required'                   ),                array(                      'field'   => 'password',                       'label'   => 'Password',                       'rules'   => 'required'                   ),                array(                      'field'   => 'passconf',                       'label'   => 'Password Confirmation',                       'rules'   => 'required'                   ),                   array(                      'field'   => 'email',                       'label'   => 'Email',                       'rules'   => 'required'                   )             );
+
+Your validation rule file will be loaded automatically and used when you
+call the run() function.
+
+Please note that you MUST name your array $config.
+
+Creating Sets of Rules
+======================
+
+In order to organize your rules into "sets" requires that you place them
+into "sub arrays". Consider the following example, showing two sets of
+rules. We've arbitrarily called these two rules "signup" and "email".
+You can name your rules anything you want::
+
+	$config = array(                  'signup' => array(                                     array(                                             'field' => 'username',                                             'label' => 'Username',                                             'rules' => 'required'                                          ),                                     array(                                             'field' => 'password',                                             'label' => 'Password',                                             'rules' => 'required'                                          ),                                     array(                                             'field' => 'passconf',                                             'label' => 'PasswordConfirmation',                                             'rules' => 'required'                                          ),                                     array(                                             'field' => 'email',                                             'label' => 'Email',                                             'rules' => 'required'                                          )                                     ),                  'email' => array(                                     array(                                             'field' => 'emailaddress',                                             'label' => 'EmailAddress',                                             'rules' => 'required|valid_email'                                          ),                                     array(                                             'field' => 'name',                                             'label' => 'Name',                                             'rules' => 'required|alpha'                                          ),                                     array(                                             'field' => 'title',                                             'label' => 'Title',                                             'rules' => 'required'                                          ),                                     array(                                             'field' => 'message',                                             'label' => 'MessageBody',                                             'rules' => 'required'                                          )                                     )                                          );
+
+Calling a Specific Rule Group
+=============================
+
+In order to call a specific group you will pass its name to the run()
+function. For example, to call the signup rule you will do this::
+
+	 if ($this->form_validation->run('signup') == FALSE) {    $this->load->view('myform'); } else {    $this->load->view('formsuccess'); }
+
+Associating a Controller Function with a Rule Group
+===================================================
+
+An alternate (and more automatic) method of calling a rule group is to
+name it according to the controller class/function you intend to use it
+with. For example, let's say you have a controller named Member and a
+function named signup. Here's what your class might look like::
+
+	 <?php class Member extends CI_Controller {     function signup()    {             $this->load->library('form_validation');                    if ($this->form_validation->run() == FALSE)       {          $this->load->view('myform');       }       else       {          $this->load->view('formsuccess');       }    } } ?>
+
+In your validation config file, you will name your rule group
+member/signup::
+
+	$config = array(            'member/signup' => array(                                     array(                                             'field' => 'username',                                             'label' => 'Username',                                             'rules' => 'required'                                          ),                                     array(                                             'field' => 'password',                                             'label' => 'Password',                                             'rules' => 'required'                                          ),                                     array(                                             'field' => 'passconf',                                             'label' => 'PasswordConfirmation',                                             'rules' => 'required'                                          ),                                     array(                                             'field' => 'email',                                             'label' => 'Email',                                             'rules' => 'required'                                          )                                     )                );
+
+When a rule group is named identically to a controller class/function it
+will be used automatically when the run() function is invoked from that
+class/function.
+
+***************************
+Using Arrays as Field Names
+***************************
+
+The Form Validation class supports the use of arrays as field names.
+Consider this example::
+
+	<input type="text" name="options[]" value="" size="50" />
+
+If you do use an array as a field name, you must use the EXACT array
+name in the `Helper Functions <#helperreference>`_ that require the
+field name, and as your Validation Rule field name.
+
+For example, to set a rule for the above field you would use::
+
+	$this->form_validation->set_rules('options[]', 'Options', 'required');
+
+Or, to show an error for the above field you would use::
+
+	<?php echo form_error('options[]'); ?>
+
+Or to re-populate the field you would use::
+
+	<input type="text" name="options[]" value="<?php echo set_value('options[]'); ?>" size="50" />
+
+You can use multidimensional arrays as field names as well. For example::
+
+	<input type="text" name="options[size]" value="" size="50" />
+
+Or even::
+
+	<input type="text" name="sports[nba][basketball]" value="" size="50" />
+
+As with our first example, you must use the exact array name in the
+helper functions::
+
+	<?php echo form_error('sports[nba][basketball]'); ?>
+
+If you are using checkboxes (or other fields) that have multiple
+options, don't forget to leave an empty bracket after each option, so
+that all selections will be added to the POST array::
+
+	 <input type="checkbox" name="options[]" value="red" /> <input type="checkbox" name="options[]" value="blue" /> <input type="checkbox" name="options[]" value="green" />
+
+Or if you use a multidimensional array::
+
+	 <input type="checkbox" name="options[color][]" value="red" /> <input type="checkbox" name="options[color][]" value="blue" /> <input type="checkbox" name="options[color][]" value="green" />
+
+When you use a helper function you'll include the bracket as well::
+
+	<?php echo form_error('options[color][]'); ?>
+
+
+**************
+Rule Reference
+**************
+
+The following is a list of all the native rules that are available to
+use:
+
+Rule
+Parameter
+Description
+Example
+**required**
+No
+Returns FALSE if the form element is empty.
+**matches**
+Yes
+Returns FALSE if the form element does not match the one in the
+parameter.
+matches[form_item]
+**is_unique**
+Yes
+Returns FALSE if the form element is not unique to the table and field
+name in the parameter.
+is_unique[table.field]
+**min_length**
+Yes
+Returns FALSE if the form element is shorter then the parameter value.
+min_length[6]
+**max_length**
+Yes
+Returns FALSE if the form element is longer then the parameter value.
+max_length[12]
+**exact_length**
+Yes
+Returns FALSE if the form element is not exactly the parameter value.
+exact_length[8]
+**greater_than**
+Yes
+Returns FALSE if the form element is less than the parameter value or
+not numeric.
+greater_than[8]
+**less_than**
+Yes
+Returns FALSE if the form element is greater than the parameter value or
+not numeric.
+less_than[8]
+**alpha**
+No
+Returns FALSE if the form element contains anything other than
+alphabetical characters.
+**alpha_numeric**
+No
+Returns FALSE if the form element contains anything other than
+alpha-numeric characters.
+**alpha_dash**
+No
+Returns FALSE if the form element contains anything other than
+alpha-numeric characters, underscores or dashes.
+**numeric**
+No
+Returns FALSE if the form element contains anything other than numeric
+characters.
+**integer**
+No
+Returns FALSE if the form element contains anything other than an
+integer.
+**decimal**
+Yes
+Returns FALSE if the form element is not exactly the parameter value.
+**is_natural**
+No
+Returns FALSE if the form element contains anything other than a natural
+number: 0, 1, 2, 3, etc.
+**is_natural_no_zero**
+No
+Returns FALSE if the form element contains anything other than a natural
+number, but not zero: 1, 2, 3, etc.
+**is_unique**
+Yes
+Returns FALSE if the form element is not unique in a database table.
+is_unique[table.field]
+**valid_email**
+No
+Returns FALSE if the form element does not contain a valid email
+address.
+**valid_emails**
+No
+Returns FALSE if any value provided in a comma separated list is not a
+valid email.
+**valid_ip**
+No
+Returns FALSE if the supplied IP is not valid.
+**valid_base64**
+No
+Returns FALSE if the supplied string contains anything other than valid
+Base64 characters.
+
+.. note:: These rules can also be called as discrete functions. For
+	example::
+
+		$this->form_validation->required($string);
+
+.. note:: You can also use any native PHP functions that permit one
+	parameter.
+
+******************
+Prepping Reference
+******************
+
+The following is a list of all the prepping functions that are available
+to use:
+
+Name
+Parameter
+Description
+**xss_clean**
+No
+Runs the data through the XSS filtering function, described in the
+:doc:`Input Class <input>` page.
+**prep_for_form**
+No
+Converts special characters so that HTML data can be shown in a form
+field without breaking it.
+**prep_url**
+No
+Adds "http://" to URLs if missing.
+**strip_image_tags**
+No
+Strips the HTML from image tags leaving the raw URL.
+**encode_php_tags**
+No
+Converts PHP tags to entities.
+
+.. note:: You can also use any native PHP functions that permit one
+	parameter, like trim, htmlspecialchars, urldecode, etc.
+
+******************
+Function Reference
+******************
+
+The following functions are intended for use in your controller
+functions.
+
+$this->form_validation->set_rules();
+======================================
+
+Permits you to set validation rules, as described in the tutorial
+sections above:
+
+-  `Setting Validation Rules <#validationrules>`_
+-  `Saving Groups of Validation Rules to a Config
+   File <#savingtoconfig>`_
+
+$this->form_validation->run();
+===============================
+
+Runs the validation routines. Returns boolean TRUE on success and FALSE
+on failure. You can optionally pass the name of the validation group via
+the function, as described in: `Saving Groups of Validation Rules to a
+Config File <#savingtoconfig>`_.
+
+$this->form_validation->set_message();
+========================================
+
+Permits you to set custom error messages. See `Setting Error
+Messages <#settingerrors>`_ above.
+
+****************
+Helper Reference
+****************
+
+The following helper functions are available for use in the view files
+containing your forms. Note that these are procedural functions, so they
+**do not** require you to prepend them with $this->form_validation.
+
+form_error()
+=============
+
+Shows an individual error message associated with the field name
+supplied to the function. Example::
+
+	<?php echo form_error('username'); ?>
+
+The error delimiters can be optionally specified. See the `Changing the
+Error Delimiters <#errordelimiters>`_ section above.
+
+validation_errors()
+====================
+
+Shows all error messages as a string: Example::
+
+	<?php echo validation_errors(); ?>
+
+The error delimiters can be optionally specified. See the `Changing the
+Error Delimiters <#errordelimiters>`_ section above.
+
+set_value()
+============
+
+Permits you to set the value of an input form or textarea. You must
+supply the field name via the first parameter of the function. The
+second (optional) parameter allows you to set a default value for the
+form. Example::
+
+	<input type="text" name="quantity" value="<?php echo set_value('quantity', '0'); ?>" size="50" />
+
+The above form will show "0" when loaded for the first time.
+
+set_select()
+=============
+
+If you use a <select> menu, this function permits you to display the
+menu item that was selected. The first parameter must contain the name
+of the select menu, the second parameter must contain the value of each
+item, and the third (optional) parameter lets you set an item as the
+default (use boolean TRUE/FALSE).
+
+Example::
+
+	 <select name="myselect"> <option value="one" <?php echo  set_select('myselect', 'one', TRUE); ?> >One</option> <option value="two" <?php echo  set_select('myselect', 'two'); ?> >Two</option> <option value="three" <?php echo  set_select('myselect', 'three'); ?> >Three</option> </select>
+
+set_checkbox()
+===============
+
+Permits you to display a checkbox in the state it was submitted. The
+first parameter must contain the name of the checkbox, the second
+parameter must contain its value, and the third (optional) parameter
+lets you set an item as the default (use boolean TRUE/FALSE). Example::
+
+	<input type="checkbox" name="mycheck[]" value="1" <?php echo set_checkbox('mycheck[]', '1'); ?> /> <input type="checkbox" name="mycheck[]" value="2" <?php echo set_checkbox('mycheck[]', '2'); ?> />
+
+set_radio()
+============
+
+Permits you to display radio buttons in the state they were submitted.
+This function is identical to the **set_checkbox()** function above.
+
+::
+
+	<input type="radio" name="myradio" value="1" <?php echo  set_radio('myradio', '1', TRUE); ?> /> <input type="radio" name="myradio" value="2" <?php echo  set_radio('myradio', '2'); ?> />
+
diff --git a/user_guide_src/source/libraries/ftp.rst b/user_guide_src/source/libraries/ftp.rst
new file mode 100644
index 0000000..7b8bd7a
--- /dev/null
+++ b/user_guide_src/source/libraries/ftp.rst
@@ -0,0 +1,200 @@
+#########
+FTP Class
+#########
+
+CodeIgniter's FTP Class permits files to be transfered to a remote
+server. Remote files can also be moved, renamed, and deleted. The FTP
+class also includes a "mirroring" function that permits an entire local
+directory to be recreated remotely via FTP.
+
+.. note:: SFTP and SSL FTP protocols are not supported, only standard
+	FTP.
+
+**********************
+Initializing the Class
+**********************
+
+Like most other classes in CodeIgniter, the FTP class is initialized in
+your controller using the $this->load->library function::
+
+	$this->load->library('ftp');
+
+Once loaded, the FTP object will be available using: $this->ftp
+
+Usage Examples
+==============
+
+In this example a connection is opened to the FTP server, and a local
+file is read and uploaded in ASCII mode. The file permissions are set to
+755. Note: Setting permissions requires PHP 5.
+
+::
+
+	 $this->load->library('ftp');  $config['hostname'] = 'ftp.example.com'; $config['username'] = 'your-username'; $config['password'] = 'your-password'; $config['debug']    = TRUE;  $this->ftp->connect($config);  $this->ftp->upload('/local/path/to/myfile.html', '/public_html/myfile.html', 'ascii', 0775);  $this->ftp->close(); 
+
+In this example a list of files is retrieved from the server.
+
+::
+
+	 $this->load->library('ftp');  $config['hostname'] = 'ftp.example.com'; $config['username'] = 'your-username'; $config['password'] = 'your-password'; $config['debug']    = TRUE;  $this->ftp->connect($config);  $list = $this->ftp->list_files('/public_html/');  print_r($list);  $this->ftp->close();
+
+In this example a local directory is mirrored on the server.
+
+::
+
+	 $this->load->library('ftp');  $config['hostname'] = 'ftp.example.com'; $config['username'] = 'your-username'; $config['password'] = 'your-password'; $config['debug']    = TRUE;  $this->ftp->connect($config);  $this->ftp->mirror('/path/to/myfolder/', '/public_html/myfolder/');  $this->ftp->close();
+
+******************
+Function Reference
+******************
+
+$this->ftp->connect()
+=====================
+
+Connects and logs into to the FTP server. Connection preferences are set
+by passing an array to the function, or you can store them in a config
+file.
+
+Here is an example showing how you set preferences manually::
+
+	 $this->load->library('ftp');  $config['hostname'] = 'ftp.example.com'; $config['username'] = 'your-username'; $config['password'] = 'your-password'; $config['port']     = 21; $config['passive']  = FALSE; $config['debug']    = TRUE;  $this->ftp->connect($config);
+
+Setting FTP Preferences in a Config File
+****************************************
+
+If you prefer you can store your FTP preferences in a config file.
+Simply create a new file called the ftp.php, add the $config array in
+that file. Then save the file at config/ftp.php and it will be used
+automatically.
+
+Available connection options
+****************************
+
+-  **hostname** - the FTP hostname. Usually something like:
+   ftp.example.com
+-  **username** - the FTP username.
+-  **password** - the FTP password.
+-  **port** - The port number. Set to 21 by default.
+-  **debug** - TRUE/FALSE (boolean). Whether to enable debugging to
+   display error messages.
+-  **passive** - TRUE/FALSE (boolean). Whether to use passive mode.
+   Passive is set automatically by default.
+
+$this->ftp->upload()
+====================
+
+Uploads a file to your server. You must supply the local path and the
+remote path, and you can optionally set the mode and permissions.
+Example::
+
+	$this->ftp->upload('/local/path/to/myfile.html', '/public_html/myfile.html', 'ascii', 0775);
+
+**Mode options are:** ascii, binary, and auto (the default). If auto is
+used it will base the mode on the file extension of the source file.
+
+Permissions are available if you are running PHP 5 and can be passed as
+an octal value in the fourth parameter.
+
+$this->ftp->download()
+======================
+
+Downloads a file from your server. You must supply the remote path and
+the local path, and you can optionally set the mode. Example::
+
+	$this->ftp->download('/public_html/myfile.html', '/local/path/to/myfile.html', 'ascii');
+
+**Mode options are:** ascii, binary, and auto (the default). If auto is
+used it will base the mode on the file extension of the source file.
+
+Returns FALSE if the download does not execute successfully (including
+if PHP does not have permission to write the local file)
+
+$this->ftp->rename()
+====================
+
+Permits you to rename a file. Supply the source file name/path and the
+new file name/path.
+
+::
+
+	 // Renames green.html to blue.html $this->ftp->rename('/public_html/foo/green.html', '/public_html/foo/blue.html');
+
+$this->ftp->move()
+==================
+
+Lets you move a file. Supply the source and destination paths::
+
+	 // Moves blog.html from "joe" to "fred" $this->ftp->move('/public_html/joe/blog.html', '/public_html/fred/blog.html');
+
+Note: if the destination file name is different the file will be
+renamed.
+
+$this->ftp->delete_file()
+==========================
+
+Lets you delete a file. Supply the source path with the file name.
+
+::
+
+	 $this->ftp->delete_file('/public_html/joe/blog.html');
+
+$this->ftp->delete_dir()
+=========================
+
+Lets you delete a directory and everything it contains. Supply the
+source path to the directory with a trailing slash.
+
+**Important** Be VERY careful with this function. It will recursively
+delete **everything** within the supplied path, including sub-folders
+and all files. Make absolutely sure your path is correct. Try using the
+list_files() function first to verify that your path is correct.
+
+::
+
+	 $this->ftp->delete_dir('/public_html/path/to/folder/');
+
+$this->ftp->list_files()
+=========================
+
+Permits you to retrieve a list of files on your server returned as an
+array. You must supply the path to the desired directory.
+
+::
+
+	 $list = $this->ftp->list_files('/public_html/');  print_r($list);
+
+$this->ftp->mirror()
+====================
+
+Recursively reads a local folder and everything it contains (including
+sub-folders) and creates a mirror via FTP based on it. Whatever the
+directory structure of the original file path will be recreated on the
+server. You must supply a source path and a destination path::
+
+	 $this->ftp->mirror('/path/to/myfolder/', '/public_html/myfolder/');
+
+$this->ftp->mkdir()
+===================
+
+Lets you create a directory on your server. Supply the path ending in
+the folder name you wish to create, with a trailing slash. Permissions
+can be set by passed an octal value in the second parameter (if you are
+running PHP 5).
+
+::
+
+	 // Creates a folder named "bar" $this->ftp->mkdir('/public_html/foo/bar/', DIR_WRITE_MODE);
+
+$this->ftp->chmod()
+===================
+
+Permits you to set file permissions. Supply the path to the file or
+folder you wish to alter permissions on::
+
+	 // Chmod "bar" to 777 $this->ftp->chmod('/public_html/foo/bar/', DIR_WRITE_MODE);
+
+$this->ftp->close();
+====================
+
+Closes the connection to your server. It's recommended that you use this
+when you are finished uploading.
diff --git a/user_guide_src/source/libraries/image_lib.rst b/user_guide_src/source/libraries/image_lib.rst
new file mode 100644
index 0000000..ca464df
--- /dev/null
+++ b/user_guide_src/source/libraries/image_lib.rst
@@ -0,0 +1,497 @@
+########################
+Image Manipulation Class
+########################
+
+CodeIgniter's Image Manipulation class lets you perform the following
+actions:
+
+-  Image Resizing
+-  Thumbnail Creation
+-  Image Cropping
+-  Image Rotating
+-  Image Watermarking
+
+All three major image libraries are supported: GD/GD2, NetPBM, and
+ImageMagick
+
+.. note:: Watermarking is only available using the GD/GD2 library. In
+	addition, even though other libraries are supported, GD is required in
+	order for the script to calculate the image properties. The image
+	processing, however, will be performed with the library you specify.
+
+**********************
+Initializing the Class
+**********************
+
+Like most other classes in CodeIgniter, the image class is initialized
+in your controller using the $this->load->library function::
+
+	$this->load->library('image_lib');
+
+Once the library is loaded it will be ready for use. The image library
+object you will use to call all functions is: $this->image_lib
+
+Processing an Image
+===================
+
+Regardless of the type of processing you would like to perform
+(resizing, cropping, rotation, or watermarking), the general process is
+identical. You will set some preferences corresponding to the action you
+intend to perform, then call one of four available processing functions.
+For example, to create an image thumbnail you'll do this::
+
+	$config['image_library'] = 'gd2'; $config['source_image'] = '/path/to/image/mypic.jpg'; $config['create_thumb'] = TRUE; $config['maintain_ratio'] = TRUE; $config['width']        = 75; $config['height']   = 50;  $this->load->library('image_lib', $config);   $this->image_lib->resize();
+
+The above code tells the image_resize function to look for an image
+called *mypic.jpg* located in the source_image folder, then create a
+thumbnail that is 75 X 50 pixels using the GD2 image_library. Since the
+maintain_ratio option is enabled, the thumb will be as close to the
+target width and height as possible while preserving the original aspect
+ratio. The thumbnail will be called *mypic_thumb.jpg*
+
+.. note:: In order for the image class to be allowed to do any
+	processing, the folder containing the image files must have write
+	permissions.
+
+.. note:: Image processing can require a considerable amount of server
+	memory for some operations. If you are experiencing out of memory errors
+	while processing images you may need to limit their maximum size, and/or
+	adjust PHP memory limits.
+
+Processing Functions
+====================
+
+There are four available processing functions:
+
+-  $this->image_lib->resize()
+-  $this->image_lib->crop()
+-  $this->image_lib->rotate()
+-  $this->image_lib->watermark()
+-  $this->image_lib->clear()
+
+These functions return boolean TRUE upon success and FALSE for failure.
+If they fail you can retrieve the error message using this function::
+
+	echo $this->image_lib->display_errors();
+
+A good practice is use the processing function conditionally, showing an
+error upon failure, like this::
+
+	if ( ! $this->image_lib->resize()) {     echo $this->image_lib->display_errors(); }
+
+Note: You can optionally specify the HTML formatting to be applied to
+the errors, by submitting the opening/closing tags in the function, like
+this::
+
+	$this->image_lib->display_errors('<p>', '</p>');
+
+Preferences
+===========
+
+The preferences described below allow you to tailor the image processing
+to suit your needs.
+
+Note that not all preferences are available for every function. For
+example, the x/y axis preferences are only available for image cropping.
+Likewise, the width and height preferences have no effect on cropping.
+The "availability" column indicates which functions support a given
+preference.
+
+Availability Legend:
+
+-  R - Image Resizing
+-  C - Image Cropping
+-  X - Image Rotation
+-  W - Image Watermarking
+
+Preference
+Default Value
+Options
+Description
+Availability
+**image_library**
+GD2
+GD, GD2, ImageMagick, NetPBM
+Sets the image library to be used.
+R, C, X, W
+**library_path**
+None
+None
+Sets the server path to your ImageMagick or NetPBM library. If you use
+either of those libraries you must supply the path.
+R, C, X
+**source_image**
+None
+None
+Sets the source image name/path. The path must be a relative or absolute
+server path, not a URL.
+R, C, S, W
+**dynamic_output**
+FALSE
+TRUE/FALSE (boolean)
+Determines whether the new image file should be written to disk or
+generated dynamically. Note: If you choose the dynamic setting, only one
+image can be shown at a time, and it can't be positioned on the page. It
+simply outputs the raw image dynamically to your browser, along with
+image headers.
+R, C, X, W
+**quality**
+90%
+1 - 100%
+Sets the quality of the image. The higher the quality the larger the
+file size.
+R, C, X, W
+**new_image**
+None
+None
+Sets the destination image name/path. You'll use this preference when
+creating an image copy. The path must be a relative or absolute server
+path, not a URL.
+R, C, X, W
+**width**
+None
+None
+Sets the width you would like the image set to.
+R, C
+**height**
+None
+None
+Sets the height you would like the image set to.
+R, C
+**create_thumb**
+FALSE
+TRUE/FALSE (boolean)
+Tells the image processing function to create a thumb.
+R
+**thumb_marker**
+_thumb
+None
+Specifies the thumbnail indicator. It will be inserted just before the
+file extension, so mypic.jpg would become mypic_thumb.jpg
+R
+**maintain_ratio**
+TRUE
+TRUE/FALSE (boolean)
+Specifies whether to maintain the original aspect ratio when resizing or
+use hard values.
+R, C
+**master_dim**
+auto
+auto, width, height
+Specifies what to use as the master axis when resizing or creating
+thumbs. For example, let's say you want to resize an image to 100 X 75
+pixels. If the source image size does not allow perfect resizing to
+those dimensions, this setting determines which axis should be used as
+the hard value. "auto" sets the axis automatically based on whether the
+image is taller then wider, or vice versa.
+R
+**rotation_angle**
+None
+90, 180, 270, vrt, hor
+Specifies the angle of rotation when rotating images. Note that PHP
+rotates counter-clockwise, so a 90 degree rotation to the right must be
+specified as 270.
+X
+**x_axis**
+None
+None
+Sets the X coordinate in pixels for image cropping. For example, a
+setting of 30 will crop an image 30 pixels from the left.
+C
+**y_axis**
+None
+None
+Sets the Y coordinate in pixels for image cropping. For example, a
+setting of 30 will crop an image 30 pixels from the top.
+C
+Setting preferences in a config file
+====================================
+
+If you prefer not to set preferences using the above method, you can
+instead put them into a config file. Simply create a new file called
+image_lib.php, add the $config array in that file. Then save the file
+in: config/image_lib.php and it will be used automatically. You will
+NOT need to use the $this->image_lib->initialize function if you save
+your preferences in a config file.
+
+$this->image_lib->resize()
+===========================
+
+The image resizing function lets you resize the original image, create a
+copy (with or without resizing), or create a thumbnail image.
+
+For practical purposes there is no difference between creating a copy
+and creating a thumbnail except a thumb will have the thumbnail marker
+as part of the name (ie, mypic_thumb.jpg).
+
+All preferences listed in the table above are available for this
+function except these three: rotation_angle, x_axis, and y_axis.
+
+Creating a Thumbnail
+--------------------
+
+The resizing function will create a thumbnail file (and preserve the
+original) if you set this preference to TRUE::
+
+	$config['create_thumb'] = TRUE;
+
+This single preference determines whether a thumbnail is created or not.
+
+Creating a Copy
+---------------
+
+The resizing function will create a copy of the image file (and preserve
+the original) if you set a path and/or a new filename using this
+preference::
+
+	$config['new_image'] = '/path/to/new_image.jpg';
+
+Notes regarding this preference:
+
+-  If only the new image name is specified it will be placed in the same
+   folder as the original
+-  If only the path is specified, the new image will be placed in the
+   destination with the same name as the original.
+-  If both the path and image name are specified it will placed in its
+   own destination and given the new name.
+
+Resizing the Original Image
+---------------------------
+
+If neither of the two preferences listed above (create_thumb, and
+new_image) are used, the resizing function will instead target the
+original image for processing.
+
+$this->image_lib->crop()
+=========================
+
+The cropping function works nearly identically to the resizing function
+except it requires that you set preferences for the X and Y axis (in
+pixels) specifying where to crop, like this::
+
+	$config['x_axis'] = '100'; $config['y_axis'] = '40';
+
+All preferences listed in the table above are available for this
+function except these: rotation_angle, width, height, create_thumb,
+new_image.
+
+Here's an example showing how you might crop an image::
+
+	$config['image_library'] = 'imagemagick'; $config['library_path'] = '/usr/X11R6/bin/'; $config['source_image'] = '/path/to/image/mypic.jpg'; $config['x_axis'] = '100'; $config['y_axis'] = '60';  $this->image_lib->initialize($config);   if ( ! $this->image_lib->crop()) {     echo $this->image_lib->display_errors(); }
+
+Note: Without a visual interface it is difficult to crop images, so this
+function is not very useful unless you intend to build such an
+interface. That's exactly what we did using for the photo gallery module
+in ExpressionEngine, the CMS we develop. We added a JavaScript UI that
+lets the cropping area be selected.
+
+$this->image_lib->rotate()
+===========================
+
+The image rotation function requires that the angle of rotation be set
+via its preference::
+
+	$config['rotation_angle'] = '90';
+
+There are 5 rotation options:
+
+#. 90 - rotates counter-clockwise by 90 degrees.
+#. 180 - rotates counter-clockwise by 180 degrees.
+#. 270 - rotates counter-clockwise by 270 degrees.
+#. hor - flips the image horizontally.
+#. vrt - flips the image vertically.
+
+Here's an example showing how you might rotate an image::
+
+	$config['image_library'] = 'netpbm'; $config['library_path'] = '/usr/bin/'; $config['source_image'] = '/path/to/image/mypic.jpg'; $config['rotation_angle'] = 'hor';  $this->image_lib->initialize($config);   if ( ! $this->image_lib->rotate()) {     echo $this->image_lib->display_errors(); }
+
+$this->image_lib->clear()
+==========================
+
+The clear function resets all of the values used when processing an
+image. You will want to call this if you are processing images in a
+loop.
+
+::
+
+	$this->image_lib->clear();
+
+
+******************
+Image Watermarking
+******************
+
+The Watermarking feature requires the GD/GD2 library.
+
+Two Types of Watermarking
+=========================
+
+There are two types of watermarking that you can use:
+
+-  **Text**: The watermark message will be generating using text, either
+   with a True Type font that you specify, or using the native text
+   output that the GD library supports. If you use the True Type version
+   your GD installation must be compiled with True Type support (most
+   are, but not all).
+-  **Overlay**: The watermark message will be generated by overlaying an
+   image (usually a transparent PNG or GIF) containing your watermark
+   over the source image.
+
+Watermarking an Image
+=====================
+
+Just as with the other functions (resizing, cropping, and rotating) the
+general process for watermarking involves setting the preferences
+corresponding to the action you intend to perform, then calling the
+watermark function. Here is an example::
+
+	 $config['source_image'] = '/path/to/image/mypic.jpg'; $config['wm_text'] = 'Copyright 2006 - John Doe'; $config['wm_type'] = 'text'; $config['wm_font_path'] = './system/fonts/texb.ttf'; $config['wm_font_size'] = '16'; $config['wm_font_color'] = 'ffffff'; $config['wm_vrt_alignment']  = 'bottom'; $config['wm_hor_alignment']  = 'center'; $config['wm_padding']  = '20';  $this->image_lib->initialize($config);   $this->image_lib->watermark();
+
+The above example will use a 16 pixel True Type font to create the text
+"Copyright 2006 - John Doe". The watermark will be positioned at the
+bottom/center of the image, 20 pixels from the bottom of the image.
+
+.. note:: In order for the image class to be allowed to do any
+	processing, the image file must have "write" file permissions. For
+	example, 777.
+
+Watermarking Preferences
+========================
+
+This table shown the preferences that are available for both types of
+watermarking (text or overlay)
+
+Preference
+Default Value
+Options
+Description
+**wm_type**
+text
+text, overlay
+Sets the type of watermarking that should be used.
+**source_image**
+None
+None
+Sets the source image name/path. The path must be a relative or absolute
+server path, not a URL.
+**dynamic_output**
+FALSE
+TRUE/FALSE (boolean)
+Determines whether the new image file should be written to disk or
+generated dynamically. Note: If you choose the dynamic setting, only one
+image can be shown at a time, and it can't be positioned on the page. It
+simply outputs the raw image dynamically to your browser, along with
+image headers.
+**quality**
+90%
+1 - 100%
+Sets the quality of the image. The higher the quality the larger the
+file size.
+**padding**
+None
+A number
+The amount of padding, set in pixels, that will be applied to the
+watermark to set it away from the edge of your images.
+**wm_vrt_alignment**
+bottom
+top, middle, bottom
+Sets the vertical alignment for the watermark image.
+**wm_hor_alignment**
+center
+left, center, right
+Sets the horizontal alignment for the watermark image.
+**wm_hor_offset**
+None
+None
+You may specify a horizontal offset (in pixels) to apply to the
+watermark position. The offset normally moves the watermark to the
+right, except if you have your alignment set to "right" then your offset
+value will move the watermark toward the left of the image.
+**wm_vrt_offset**
+None
+None
+You may specify a vertical offset (in pixels) to apply to the watermark
+position. The offset normally moves the watermark down, except if you
+have your alignment set to "bottom" then your offset value will move the
+watermark toward the top of the image.
+Text Preferences
+----------------
+
+This table shown the preferences that are available for the text type of
+watermarking.
+
+Preference
+Default Value
+Options
+Description
+**wm_text**
+None
+None
+The text you would like shown as the watermark. Typically this will be a
+copyright notice.
+**wm_font_path**
+None
+None
+The server path to the True Type Font you would like to use. If you do
+not use this option, the native GD font will be used.
+**wm_font_size**
+16
+None
+The size of the text. Note: If you are not using the True Type option
+above, the number is set using a range of 1 - 5. Otherwise, you can use
+any valid pixel size for the font you're using.
+**wm_font_color**
+ffffff
+None
+The font color, specified in hex. Note, you must use the full 6
+character hex value (ie, 993300), rather than the three character
+abbreviated version (ie fff).
+**wm_shadow_color**
+None
+None
+The color of the drop shadow, specified in hex. If you leave this blank
+a drop shadow will not be used. Note, you must use the full 6 character
+hex value (ie, 993300), rather than the three character abbreviated
+version (ie fff).
+**wm_shadow_distance**
+3
+None
+The distance (in pixels) from the font that the drop shadow should
+appear.
+Overlay Preferences
+-------------------
+
+This table shown the preferences that are available for the overlay type
+of watermarking.
+
+Preference
+Default Value
+Options
+Description
+**wm_overlay_path**
+None
+None
+The server path to the image you wish to use as your watermark. Required
+only if you are using the overlay method.
+**wm_opacity**
+50
+1 - 100
+Image opacity. You may specify the opacity (i.e. transparency) of your
+watermark image. This allows the watermark to be faint and not
+completely obscure the details from the original image behind it. A 50%
+opacity is typical.
+**wm_x_transp**
+4
+A number
+If your watermark image is a PNG or GIF image, you may specify a color
+on the image to be "transparent". This setting (along with the next)
+will allow you to specify that color. This works by specifying the "X"
+and "Y" coordinate pixel (measured from the upper left) within the image
+that corresponds to a pixel representative of the color you want to be
+transparent.
+**wm_y_transp**
+4
+A number
+Along with the previous setting, this allows you to specify the
+coordinate to a pixel representative of the color you want to be
+transparent.
diff --git a/user_guide_src/source/libraries/index.rst b/user_guide_src/source/libraries/index.rst
new file mode 100644
index 0000000..678b633
--- /dev/null
+++ b/user_guide_src/source/libraries/index.rst
@@ -0,0 +1,9 @@
+#########
+Libraries
+#########
+
+.. toctree::
+	:glob:
+	:titlesonly:
+	
+	*
\ No newline at end of file
diff --git a/user_guide_src/source/libraries/input.rst b/user_guide_src/source/libraries/input.rst
new file mode 100644
index 0000000..fd3cb57
--- /dev/null
+++ b/user_guide_src/source/libraries/input.rst
@@ -0,0 +1,273 @@
+###########
+Input Class
+###########
+
+The Input Class serves two purposes:
+
+#. It pre-processes global input data for security.
+#. It provides some helper functions for fetching input data and
+   pre-processing it.
+
+.. note:: This class is initialized automatically by the system so there
+	is no need to do it manually.
+
+Security Filtering
+==================
+
+The security filtering function is called automatically when a new
+:doc:`controller <../general/controllers>` is invoked. It does the
+following:
+
+-  If $config['allow_get_array'] is FALSE(default is TRUE), destroys
+   the global GET array.
+-  Destroys all global variables in the event register_globals is
+   turned on.
+-  Filters the GET/POST/COOKIE array keys, permitting only alpha-numeric
+   (and a few other) characters.
+-  Provides XSS (Cross-site Scripting Hacks) filtering. This can be
+   enabled globally, or upon request.
+-  Standardizes newline characters to \\n(In Windows \\r\\n)
+
+XSS Filtering
+=============
+
+The Input class has the ability to filter input automatically to prevent
+cross-site scripting attacks. If you want the filter to run
+automatically every time it encounters POST or COOKIE data you can
+enable it by opening your application/config/config.php file and setting
+this::
+
+	$config['global_xss_filtering'] = TRUE;
+
+Please refer to the :doc:`Security class <security>` documentation for
+information on using XSS Filtering in your application.
+
+Using POST, COOKIE, or SERVER Data
+==================================
+
+CodeIgniter comes with three helper functions that let you fetch POST,
+COOKIE or SERVER items. The main advantage of using the provided
+functions rather than fetching an item directly ($_POST['something'])
+is that the functions will check to see if the item is set and return
+false (boolean) if not. This lets you conveniently use data without
+having to test whether an item exists first. In other words, normally
+you might do something like this::
+
+	 if ( ! isset($_POST['something'])) {     $something = FALSE; } else {     $something = $_POST['something']; }
+
+With CodeIgniter's built in functions you can simply do this::
+
+	$something = $this->input->post('something');
+
+The three functions are:
+
+-  $this->input->post()
+-  $this->input->cookie()
+-  $this->input->server()
+
+$this->input->post()
+====================
+
+The first parameter will contain the name of the POST item you are
+looking for::
+
+	$this->input->post('some_data');
+
+The function returns FALSE (boolean) if the item you are attempting to
+retrieve does not exist.
+
+The second optional parameter lets you run the data through the XSS
+filter. It's enabled by setting the second parameter to boolean TRUE;
+
+::
+
+	$this->input->post('some_data', TRUE);
+
+To return an array of all POST items call without any parameters.
+
+To return all POST items and pass them through the XSS filter set the
+first parameter NULL while setting the second parameter to boolean;
+
+The function returns FALSE (boolean) if there are no items in the POST.
+
+::
+
+	     $this->input->post(NULL, TRUE); // returns all POST items with XSS filter          $this->input->post(); // returns all POST items without XSS filter
+
+$this->input->get()
+===================
+
+This function is identical to the post function, only it fetches get
+data::
+
+	$this->input->get('some_data', TRUE);
+
+To return an array of all GET items call without any parameters.
+
+To return all GET items and pass them through the XSS filter set the
+first parameter NULL while setting the second parameter to boolean;
+
+The function returns FALSE (boolean) if there are no items in the GET.
+
+::
+
+	     $this->input->get(NULL, TRUE); // returns all GET items with XSS filter          $this->input->get(); // returns all GET items without XSS filtering
+
+$this->input->get_post()
+=========================
+
+This function will search through both the post and get streams for
+data, looking first in post, and then in get::
+
+	$this->input->get_post('some_data', TRUE);
+
+$this->input->cookie()
+======================
+
+This function is identical to the post function, only it fetches cookie
+data::
+
+	$this->input->cookie('some_data', TRUE);
+
+$this->input->server()
+======================
+
+This function is identical to the above functions, only it fetches
+server data::
+
+	$this->input->server('some_data');
+
+$this->input->set_cookie()
+===========================
+
+Sets a cookie containing the values you specify. There are two ways to
+pass information to this function so that a cookie can be set: Array
+Method, and Discrete Parameters:
+
+Array Method
+^^^^^^^^^^^^
+
+Using this method, an associative array is passed to the first
+parameter::
+
+	$cookie = array(     'name'   => 'The Cookie Name',     'value'  => 'The Value',     'expire' => '86500',     'domain' => '.some-domain.com',     'path'   => '/',     'prefix' => 'myprefix_',     'secure' => TRUE );  $this->input->set_cookie($cookie);
+
+**Notes:**
+
+Only the name and value are required. To delete a cookie set it with the
+expiration blank.
+
+The expiration is set in **seconds**, which will be added to the current
+time. Do not include the time, but rather only the number of seconds
+from *now* that you wish the cookie to be valid. If the expiration is
+set to zero the cookie will only last as long as the browser is open.
+
+For site-wide cookies regardless of how your site is requested, add your
+URL to the **domain** starting with a period, like this:
+.your-domain.com
+
+The path is usually not needed since the function sets a root path.
+
+The prefix is only needed if you need to avoid name collisions with
+other identically named cookies for your server.
+
+The secure boolean is only needed if you want to make it a secure cookie
+by setting it to TRUE.
+
+Discrete Parameters
+^^^^^^^^^^^^^^^^^^^
+
+If you prefer, you can set the cookie by passing data using individual
+parameters::
+
+	$this->input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure);
+
+$this->input->cookie()
+======================
+
+Lets you fetch a cookie. The first parameter will contain the name of
+the cookie you are looking for (including any prefixes)::
+
+	cookie('some_cookie');
+
+The function returns FALSE (boolean) if the item you are attempting to
+retrieve does not exist.
+
+The second optional parameter lets you run the data through the XSS
+filter. It's enabled by setting the second parameter to boolean TRUE;
+
+::
+
+	cookie('some_cookie', TRUE);
+
+
+$this->input->ip_address()
+===========================
+
+Returns the IP address for the current user. If the IP address is not
+valid, the function will return an IP of: 0.0.0.0
+
+::
+
+	echo $this->input->ip_address();
+
+$this->input->valid_ip($ip)
+============================
+
+Takes an IP address as input and returns TRUE or FALSE (boolean) if it
+is valid or not. Note: The $this->input->ip_address() function above
+validates the IP automatically.
+
+::
+
+	if ( ! $this->input->valid_ip($ip)) {      echo 'Not Valid'; } else {      echo 'Valid'; }
+
+$this->input->user_agent()
+===========================
+
+Returns the user agent (web browser) being used by the current user.
+Returns FALSE if it's not available.
+
+::
+
+	echo $this->input->user_agent();
+
+See the :doc:`User Agent Class <user_agent>` for methods which extract
+information from the user agent string.
+
+$this->input->request_headers()
+================================
+
+Useful if running in a non-Apache environment where
+`apache_request_headers() <http://php.net/apache_request_headers>`_
+will not be supported. Returns an array of headers.
+
+::
+
+	$headers = $this->input->request_headers();
+
+$this->input->get_request_header();
+=====================================
+
+Returns a single member of the request headers array.
+
+::
+
+	$this->input->get_request_header('some-header', TRUE);
+
+$this->input->is_ajax_request()
+=================================
+
+Checks to see if the HTTP_X_REQUESTED_WITH server header has been
+set, and returns a boolean response.
+
+$this->input->is_cli_request()
+================================
+
+Checks to see if the STDIN constant is set, which is a failsafe way to
+see if PHP is being run on the command line.
+
+::
+
+	$this->input->is_cli_request()
+
diff --git a/user_guide_src/source/libraries/javascript.rst b/user_guide_src/source/libraries/javascript.rst
new file mode 100644
index 0000000..12eb94d
--- /dev/null
+++ b/user_guide_src/source/libraries/javascript.rst
@@ -0,0 +1,291 @@
+.. note:: This driver is experimental. Its feature set and
+	implementation may change in future releases.
+
+################
+Javascript Class
+################
+
+CodeIgniter provides a library to help you with certain common functions
+that you may want to use with Javascript. Please note that CodeIgniter
+does not require the jQuery library to run, and that any scripting
+library will work equally well. The jQuery library is simply presented
+as a convenience if you choose to use it.
+
+Initializing the Class
+======================
+
+To initialize the Javascript class manually in your controller
+constructor, use the $this->load->library function. Currently, the only
+available library is jQuery, which will automatically be loaded like
+this::
+
+	$this->load->library('javascript');
+
+The Javascript class also accepts parameters, js_library_driver
+(string) default 'jquery' and autoload (bool) default TRUE. You may
+override the defaults if you wish by sending an associative array::
+
+	$this->load->library('javascript', array('js_library_driver' => 'scripto', 'autoload' => FALSE));
+
+Again, presently only 'jquery' is available. You may wish to set
+autoload to FALSE, though, if you do not want the jQuery library to
+automatically include a script tag for the main jQuery script file. This
+is useful if you are loading it from a location outside of CodeIgniter,
+or already have the script tag in your markup.
+
+Once loaded, the jQuery library object will be available using:
+$this->javascript
+
+Setup and Configuration
+=======================
+
+Set these variables in your view
+--------------------------------
+
+As a Javascript library, your files must be available to your
+application.
+
+As Javascript is a client side language, the library must be able to
+write content into your final output. This generally means a view.
+You'll need to include the following variables in the <head> sections of
+your output.
+
+::
+
+	<?php echo $library_src;?> <?php echo $script_head;?>
+
+
+$library_src, is where the actual library file will be loaded, as well
+as any subsequent plugin script calls; $script_head is where specific
+events, functions and other commands will be rendered.
+
+Set the path to the librarys with config items
+----------------------------------------------
+
+There are some configuration items in Javascript library. These can
+either be set in application/config.php, within its own
+config/javascript.php file, or within any controller usings the
+set_item() function.
+
+An image to be used as an "ajax loader", or progress indicator. Without
+one, the simple text message of "loading" will appear when Ajax calls
+need to be made.
+
+::
+
+	$config['javascript_location'] = 'http://localhost/codeigniter/themes/js/jquery/';         $config['javascript_ajax_img'] = 'images/ajax-loader.gif';
+
+
+If you keep your files in the same directories they were downloaded
+from, then you need not set this configuration items.
+
+The jQuery Class
+================
+
+To initialize the jQuery class manually in your controller constructor,
+use the $this->load->library function::
+
+	$this->load->library('jquery');
+
+You may send an optional parameter to determine whether or not a script
+tag for the main jQuery file will be automatically included when loading
+the library. It will be created by default. To prevent this, load the
+library as follows::
+
+	$this->load->library('jquery', FALSE);
+
+Once loaded, the jQuery library object will be available using:
+$this->jquery
+
+jQuery Events
+=============
+
+Events are set using the following syntax.
+
+::
+
+	$this->jquery->event('element_path', code_to_run());
+
+
+In the above example:
+
+-  "event" is any of blur, change, click, dblclick, error, focus, hover,
+   keydown, keyup, load, mousedown, mouseup, mouseover, mouseup, resize,
+   scroll, or unload.
+-  "element_path" is any valid `jQuery
+   selector <http://docs.jquery.com/Selectors>`_. Due to jQuery's unique
+   selector syntax, this is usually an element id, or CSS selector. For
+   example "#notice_area" would effect <div id="notice_area">, and
+   "#content a.notice" would effect all anchors with a class of "notice"
+   in the div with id "content".
+-  "code_to_run()" is script your write yourself, or an action such as
+   an effect from the jQuery library below.
+
+Effects
+=======
+
+The query library supports a powerful
+`Effects <http://docs.jquery.com/Effects>`_ repertoire. Before an effect
+can be used, it must be loaded::
+
+	$this->jquery->effect([optional path] plugin name); // for example $this->jquery->effect('bounce');
+
+
+hide() / show()
+---------------
+
+Each of this functions will affect the visibility of an item on your
+page. hide() will set an item invisible, show() will reveal it.
+
+::
+
+	$this->jquery->hide(target,  optional speed, optional extra information);     $this->jquery->show(target,  optional speed, optional extra information);
+
+
+-  "target" will be any valid jQuery selector or selectors.
+-  "speed" is optional, and is set to either slow, normal, fast, or
+   alternatively a number of milliseconds.
+-  "extra information" is optional, and could include a callback, or
+   other additional information.
+
+toggle()
+--------
+
+toggle() will change the visibility of an item to the opposite of its
+current state, hiding visible elements, and revealing hidden ones.
+
+::
+
+	$this->jquery->toggle(target);
+
+
+-  "target" will be any valid jQuery selector or selectors.
+
+animate()
+---------
+
+::
+
+	 $this->jquery->animate(target, parameters, optional speed, optional extra information);
+
+
+-  "target" will be any valid jQuery selector or selectors.
+-  "parameters" in jQuery would generally include a series of CSS
+   properties that you wish to change.
+-  "speed" is optional, and is set to either slow, normal, fast, or
+   alternatively a number of milliseconds.
+-  "extra information" is optional, and could include a callback, or
+   other additional information.
+
+For a full summary, see
+`http://docs.jquery.com/Effects/animate <http://docs.jquery.com/Effects/animate>`_
+
+Here is an example of an animate() called on a div with an id of "note",
+and triggered by a click using the jQuery library's click() event.
+
+::
+
+	 $params = array(     'height' => 80,     'width' => '50%',     'marginLeft' => 125 ); $this->jquery->click('#trigger', $this->jquery->animate('#note', $params, normal));
+
+
+fadeIn() / fadeOut()
+--------------------
+
+::
+
+	$this->jquery->fadeIn(target,  optional speed, optional extra information);     $this->jquery->fadeOut(target,  optional speed, optional extra information);
+
+
+-  "target" will be any valid jQuery selector or selectors.
+-  "speed" is optional, and is set to either slow, normal, fast, or
+   alternatively a number of milliseconds.
+-  "extra information" is optional, and could include a callback, or
+   other additional information.
+
+toggleClass()
+-------------
+
+This function will add or remove a CSS class to its target.
+
+::
+
+	$this->jquery->toggleClass(target, class)
+
+
+-  "target" will be any valid jQuery selector or selectors.
+-  "class" is any CSS classname. Note that this class must be defined
+   and available in a CSS that is already loaded.
+
+fadeIn() / fadeOut()
+--------------------
+
+These effects cause an element(s) to disappear or reappear over time.
+
+::
+
+	$this->jquery->fadeIn(target,  optional speed, optional extra information);     $this->jquery->fadeOut(target,  optional speed, optional extra information);
+
+
+-  "target" will be any valid jQuery selector or selectors.
+-  "speed" is optional, and is set to either slow, normal, fast, or
+   alternatively a number of milliseconds.
+-  "extra information" is optional, and could include a callback, or
+   other additional information.
+
+slideUp() / slideDown() / slideToggle()
+---------------------------------------
+
+These effects cause an element(s) to slide.
+
+::
+
+	$this->jquery->slideUp(target,  optional speed, optional extra information);     $this->jquery->slideDown(target,  optional speed, optional extra information); $this->jquery->slideToggle(target,  optional speed, optional extra information);
+
+
+-  "target" will be any valid jQuery selector or selectors.
+-  "speed" is optional, and is set to either slow, normal, fast, or
+   alternatively a number of milliseconds.
+-  "extra information" is optional, and could include a callback, or
+   other additional information.
+
+Plugins
+=======
+
+Some select jQuery plugins are made available using this library.
+
+corner()
+--------
+
+Used to add distinct corners to page elements. For full details see
+`http://www.malsup.com/jquery/corner/ <http://www.malsup.com/jquery/corner/>`_
+
+::
+
+	$this->jquery->corner(target, corner_style);
+
+
+-  "target" will be any valid jQuery selector or selectors.
+-  "corner_style" is optional, and can be set to any valid style such
+   as round, sharp, bevel, bite, dog, etc. Individual corners can be set
+   by following the style with a space and using "tl" (top left), "tr"
+   (top right), "bl" (bottom left), or "br" (bottom right).
+
+::
+
+	$this->jquery->corner("#note", "cool tl br");
+
+
+tablesorter()
+-------------
+
+description to come
+
+modal()
+-------
+
+description to come
+
+calendar()
+----------
+
+description to come
diff --git a/user_guide_src/source/libraries/language.rst b/user_guide_src/source/libraries/language.rst
new file mode 100644
index 0000000..a148d5a
--- /dev/null
+++ b/user_guide_src/source/libraries/language.rst
@@ -0,0 +1,88 @@
+##############
+Language Class
+##############
+
+The Language Class provides functions to retrieve language files and
+lines of text for purposes of internationalization.
+
+In your CodeIgniter system folder you'll find one called language
+containing sets of language files. You can create your own language
+files as needed in order to display error and other messages in other
+languages.
+
+Language files are typically stored in your system/language directory.
+Alternately you can create a folder called language inside your
+application folder and store them there. CodeIgniter will look first in
+your application/language directory. If the directory does not exist or
+the specified language is not located there CI will instead look in your
+global system/language folder.
+
+.. note:: Each language should be stored in its own folder. For example,
+	the English files are located at: system/language/english
+
+Creating Language Files
+=======================
+
+Language files must be named with _lang.php as the file extension. For
+example, let's say you want to create a file containing error messages.
+You might name it: error_lang.php
+
+Within the file you will assign each line of text to an array called
+$lang with this prototype::
+
+	$lang['language_key'] = "The actual message to be shown";
+
+.. note:: It's a good practice to use a common prefix for all messages
+	in a given file to avoid collisions with similarly named items in other
+	files. For example, if you are creating error messages you might prefix
+	them with error\_
+
+::
+
+	$lang['error_email_missing'] = "You must submit an email address"; $lang['error_url_missing'] = "You must submit a URL"; $lang['error_username_missing'] = "You must submit a username";
+
+Loading A Language File
+=======================
+
+In order to fetch a line from a particular file you must load the file
+first. Loading a language file is done with the following code::
+
+	$this->lang->load('filename', 'language');
+
+Where filename is the name of the file you wish to load (without the
+file extension), and language is the language set containing it (ie,
+english). If the second parameter is missing, the default language set
+in your application/config/config.php file will be used.
+
+Fetching a Line of Text
+=======================
+
+Once your desired language file is loaded you can access any line of
+text using this function::
+
+	$this->lang->line('language_key');
+
+Where language_key is the array key corresponding to the line you wish
+to show.
+
+Note: This function simply returns the line. It does not echo it for
+you.
+
+Using language lines as form labels
+-----------------------------------
+
+This feature has been deprecated from the language library and moved to
+the lang() function of the :doc:`Language
+helper <../helpers/language_helper>`.
+
+Auto-loading Languages
+======================
+
+If you find that you need a particular language globally throughout your
+application, you can tell CodeIgniter to
+:doc:`auto-load <../general/autoloader>` it during system
+initialization. This is done by opening the
+application/config/autoload.php file and adding the language(s) to the
+autoload array.
+
+
diff --git a/user_guide_src/source/libraries/loader.rst b/user_guide_src/source/libraries/loader.rst
new file mode 100644
index 0000000..59420e1
--- /dev/null
+++ b/user_guide_src/source/libraries/loader.rst
@@ -0,0 +1,259 @@
+############
+Loader Class
+############
+
+Loader, as the name suggests, is used to load elements. These elements
+can be libraries (classes) :doc:`View files <../general/views>`,
+:doc:`Helpers <../general/helpers>`,
+:doc:`Models <../general/models>`, or your own files.
+
+.. note:: This class is initialized automatically by the system so there
+	is no need to do it manually.
+
+The following functions are available in this class:
+
+$this->load->library('class_name', $config, 'object name')
+===========================================================
+
+This function is used to load core classes. Where class_name is the
+name of the class you want to load. Note: We use the terms "class" and
+"library" interchangeably.
+
+For example, if you would like to send email with CodeIgniter, the first
+step is to load the email class within your controller::
+
+	$this->load->library('email');
+
+Once loaded, the library will be ready for use, using
+$this->email->*some_function*().
+
+Library files can be stored in subdirectories within the main
+"libraries" folder, or within your personal application/libraries
+folder. To load a file located in a subdirectory, simply include the
+path, relative to the "libraries" folder. For example, if you have file
+located at::
+
+	libraries/flavors/chocolate.php
+
+You will load it using::
+
+	$this->load->library('flavors/chocolate');
+
+You may nest the file in as many subdirectories as you want.
+
+Additionally, multiple libraries can be loaded at the same time by
+passing an array of libraries to the load function.
+
+::
+
+	$this->load->library(array('email', 'table'));
+
+Setting options
+---------------
+
+The second (optional) parameter allows you to optionally pass
+configuration setting. You will typically pass these as an array::
+
+	 $config = array (                   'mailtype' => 'html',                   'charset'  => 'utf-8,                   'priority' => '1'                );  $this->load->library('email', $config);
+
+Config options can usually also be set via a config file. Each library
+is explained in detail in its own page, so please read the information
+regarding each one you would like to use.
+
+Please take note, when multiple libraries are supplied in an array for
+the first parameter, each will receive the same parameter information.
+
+Assigning a Library to a different object name
+----------------------------------------------
+
+If the third (optional) parameter is blank, the library will usually be
+assigned to an object with the same name as the library. For example, if
+the library is named Session, it will be assigned to a variable named
+$this->session.
+
+If you prefer to set your own class names you can pass its value to the
+third parameter::
+
+	$this->load->library('session', '', 'my_session');  // Session class is now accessed using:  $this->my_session 
+
+Please take note, when multiple libraries are supplied in an array for
+the first parameter, this parameter is discarded.
+
+$this->load->view('file_name', $data, true/false)
+==================================================
+
+This function is used to load your View files. If you haven't read the
+:doc:`Views <../general/views>` section of the user guide it is
+recommended that you do since it shows you how this function is
+typically used.
+
+The first parameter is required. It is the name of the view file you
+would like to load. Note: The .php file extension does not need to be
+specified unless you use something other than .php.
+
+The second **optional** parameter can take an associative array or an
+object as input, which it runs through the PHP
+`extract <http://www.php.net/extract>`_ function to convert to variables
+that can be used in your view files. Again, read the
+:doc:`Views <../general/views>` page to learn how this might be useful.
+
+The third **optional** parameter lets you change the behavior of the
+function so that it returns data as a string rather than sending it to
+your browser. This can be useful if you want to process the data in some
+way. If you set the parameter to true (boolean) it will return data. The
+default behavior is false, which sends it to your browser. Remember to
+assign it to a variable if you want the data returned::
+
+	$string = $this->load->view('myfile', '', true);
+
+$this->load->model('Model_name');
+==================================
+
+::
+
+	$this->load->model('Model_name');
+
+
+If your model is located in a sub-folder, include the relative path from
+your models folder. For example, if you have a model located at
+application/models/blog/queries.php you'll load it using::
+
+	$this->load->model('blog/queries');
+
+
+If you would like your model assigned to a different object name you can
+specify it via the second parameter of the loading function::
+
+	 $this->load->model('Model_name', 'fubar');  $this->fubar->function();
+
+$this->load->database('options', true/false)
+============================================
+
+This function lets you load the database class. The two parameters are
+**optional**. Please see the :doc:`database <../database/index>`
+section for more info.
+
+$this->load->vars($array)
+=========================
+
+This function takes an associative array as input and generates
+variables using the PHP `extract <http://www.php.net/extract>`_
+function. This function produces the same result as using the second
+parameter of the $this->load->view() function above. The reason you
+might want to use this function independently is if you would like to
+set some global variables in the constructor of your controller and have
+them become available in any view file loaded from any function. You can
+have multiple calls to this function. The data get cached and merged
+into one array for conversion to variables.
+
+$this->load->get_var($key)
+===========================
+
+This function checks the associative array of variables available to
+your views. This is useful if for any reason a var is set in a library
+or another controller method using $this->load->vars().
+
+$this->load->helper('file_name')
+=================================
+
+This function loads helper files, where file_name is the name of the
+file, without the _helper.php extension.
+
+$this->load->file('filepath/filename', true/false)
+==================================================
+
+This is a generic file loading function. Supply the filepath and name in
+the first parameter and it will open and read the file. By default the
+data is sent to your browser, just like a View file, but if you set the
+second parameter to true (boolean) it will instead return the data as a
+string.
+
+$this->load->language('file_name')
+===================================
+
+This function is an alias of the :doc:`language loading
+function <language>`: $this->lang->load()
+
+$this->load->config('file_name')
+=================================
+
+This function is an alias of the :doc:`config file loading
+function <config>`: $this->config->load()
+
+Application "Packages"
+======================
+
+An application package allows for the easy distribution of complete sets
+of resources in a single directory, complete with its own libraries,
+models, helpers, config, and language files. It is recommended that
+these packages be placed in the application/third_party folder. Below
+is a sample map of an package directory
+
+Sample Package "Foo Bar" Directory Map
+======================================
+
+The following is an example of a directory for an application package
+named "Foo Bar".
+
+::
+
+	/application/third_party/foo_bar  config/ helpers/ language/ libraries/ models/
+
+Whatever the purpose of the "Foo Bar" application package, it has its
+own config files, helpers, language files, libraries, and models. To use
+these resources in your controllers, you first need to tell the Loader
+that you are going to be loading resources from a package, by adding the
+package path.
+
+$this->load->add_package_path()
+---------------------------------
+
+Adding a package path instructs the Loader class to prepend a given path
+for subsequent requests for resources. As an example, the "Foo Bar"
+application package above has a library named Foo_bar.php. In our
+controller, we'd do the following::
+
+	$this->load->add_package_path(APPPATH.'third_party/foo_bar/'); $this->load->library('foo_bar');
+
+$this->load->remove_package_path()
+------------------------------------
+
+When your controller is finished using resources from an application
+package, and particularly if you have other application packages you
+want to work with, you may wish to remove the package path so the Loader
+no longer looks in that folder for resources. To remove the last path
+added, simply call the method with no parameters.
+
+$this->load->remove_package_path()
+------------------------------------
+
+Or to remove a specific package path, specify the same path previously
+given to add_package_path() for a package.::
+
+	$this->load->remove_package_path(APPPATH.'third_party/foo_bar/');
+
+Package view files
+------------------
+
+By Default, package view files paths are set when add_package_path()
+is called. View paths are looped through, and once a match is
+encountered that view is loaded.
+
+In this instance, it is possible for view naming collisions within
+packages to occur, and possibly the incorrect package being loaded. To
+ensure against this, set an optional second parameter of FALSE when
+calling add_package_path().
+
+::
+
+	$this->load->add_package_path(APPPATH.'my_app', FALSE);
+	$this->load->view('my_app_index'); // Loads
+	$this->load->view('welcome_message'); // Will not load the default welcome_message b/c the second param to add_package_path is FALSE
+
+	// Reset things
+	$this->load->remove_package_path(APPPATH.'my_app');
+
+	// Again without the second parameter:
+	$this->load->add_package_path(APPPATH.'my_app', TRUE);
+	$this->load->view('my_app_index'); // Loads
+	$this->load->view('welcome_message'); // Loads
\ No newline at end of file
diff --git a/user_guide_src/source/libraries/output.rst b/user_guide_src/source/libraries/output.rst
new file mode 100644
index 0000000..8b9b047
--- /dev/null
+++ b/user_guide_src/source/libraries/output.rst
@@ -0,0 +1,132 @@
+############
+Output Class
+############
+
+The Output class is a small class with one main function: To send the
+finalized web page to the requesting browser. It is also responsible for
+:doc:`caching <../general/caching>` your web pages, if you use that
+feature.
+
+.. note:: This class is initialized automatically by the system so there
+	is no need to do it manually.
+
+Under normal circumstances you won't even notice the Output class since
+it works transparently without your intervention. For example, when you
+use the :doc:`Loader <../libraries/loader>` class to load a view file,
+it's automatically passed to the Output class, which will be called
+automatically by CodeIgniter at the end of system execution. It is
+possible, however, for you to manually intervene with the output if you
+need to, using either of the two following functions:
+
+$this->output->set_output();
+=============================
+
+Permits you to manually set the final output string. Usage example::
+
+	$this->output->set_output($data);
+
+.. important:: If you do set your output manually, it must be the last
+	thing done in the function you call it from. For example, if you build a
+	page in one of your controller functions, don't set the output until the
+	end.
+
+$this->output->set_content_type();
+====================================
+
+Permits you to set the mime-type of your page so you can serve JSON
+data, JPEG's, XML, etc easily.
+
+::
+
+	$this->output
+	    ->set_content_type('application/json')
+	    ->set_output(json_encode(array('foo' => 'bar')));
+
+	$this->output
+	    ->set_content_type('jpeg') // You could also use ".jpeg" which will have the full stop removed before looking in config/mimes.php
+	    ->set_output(file_get_contents('files/something.jpg'));
+
+.. important:: Make sure any non-mime string you pass to this method
+	exists in config/mimes.php or it will have no effect.
+
+$this->output->get_output();
+=============================
+
+Permits you to manually retrieve any output that has been sent for
+storage in the output class. Usage example::
+
+	$string = $this->output->get_output();
+
+Note that data will only be retrievable from this function if it has
+been previously sent to the output class by one of the CodeIgniter
+functions like $this->load->view().
+
+$this->output->append_output();
+================================
+
+Appends data onto the output string. Usage example::
+
+	$this->output->append_output($data);
+
+$this->output->set_header();
+=============================
+
+Permits you to manually set server headers, which the output class will
+send for you when outputting the final rendered display. Example::
+
+	 $this->output->set_header("HTTP/1.0 200 OK"); $this->output->set_header("HTTP/1.1 200 OK"); $this->output->set_header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_update).' GMT'); $this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate"); $this->output->set_header("Cache-Control: post-check=0, pre-check=0"); $this->output->set_header("Pragma: no-cache");  
+
+$this->output->set_status_header(code, 'text');
+=================================================
+
+Permits you to manually set a server status header. Example::
+
+	$this->output->set_status_header('401'); // Sets the header as:  Unauthorized
+
+`See here <http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html>`_ for
+a full list of headers.
+
+$this->output->enable_profiler();
+==================================
+
+Permits you to enable/disable the
+:doc:`Profiler <../general/profiling>`, which will display benchmark
+and other data at the bottom of your pages for debugging and
+optimization purposes.
+
+To enable the profiler place the following function anywhere within your
+:doc:`Controller <../general/controllers>` functions::
+
+	$this->output->enable_profiler(TRUE);
+
+When enabled a report will be generated and inserted at the bottom of
+your pages.
+
+To disable the profiler you will use::
+
+	$this->output->enable_profiler(FALSE);
+
+$this->output->set_profiler_sections();
+=========================================
+
+Permits you to enable/disable specific sections of the Profiler when
+enabled. Please refer to the :doc:`Profiler <../general/profiling>`
+documentation for further information.
+
+$this->output->cache();
+=======================
+
+The CodeIgniter output library also controls caching. For more
+information, please see the :doc:`caching
+documentation <../general/caching>`.
+
+Parsing Execution Variables
+===========================
+
+CodeIgniter will parse the pseudo-variables {elapsed_time} and
+{memory_usage} in your output by default. To disable this, set the
+$parse_exec_vars class property to FALSE in your controller.
+::
+
+	$this->output->parse_exec_vars = FALSE;
+
diff --git a/user_guide_src/source/libraries/pagination.rst b/user_guide_src/source/libraries/pagination.rst
new file mode 100644
index 0000000..4d8b3b5
--- /dev/null
+++ b/user_guide_src/source/libraries/pagination.rst
@@ -0,0 +1,248 @@
+################
+Pagination Class
+################
+
+CodeIgniter's Pagination class is very easy to use, and it is 100%
+customizable, either dynamically or via stored preferences.
+
+If you are not familiar with the term "pagination", it refers to links
+that allows you to navigate from page to page, like this::
+
+	« First  < 1 2 3 4 5 >  Last »
+
+*******
+Example
+*******
+
+Here is a simple example showing how to create pagination in one of your
+:doc:`controller <../general/controllers>` functions::
+
+	 $this->load->library('pagination'); $config['base_url'] = 'http://example.com/index.php/test/page/'; $config['total_rows'] = 200; $config['per_page']  = 20;  $this->pagination->initialize($config);   echo  $this->pagination->create_links();
+
+Notes
+=====
+
+The $config array contains your configuration variables. It is passed to
+the $this->pagination->initialize function as shown above. Although
+there are some twenty items you can configure, at minimum you need the
+three shown. Here is a description of what those items represent:
+
+-  **base_url** This is the full URL to the controller class/function
+   containing your pagination. In the example above, it is pointing to a
+   controller called "Test" and a function called "page". Keep in mind
+   that you can :doc:`re-route your URI <../general/routing>` if you
+   need a different structure.
+-  **total_rows** This number represents the total rows in the result
+   set you are creating pagination for. Typically this number will be
+   the total rows that your database query returned.
+-  **per_page** The number of items you intend to show per page. In the
+   above example, you would be showing 20 items per page.
+
+The create_links() function returns an empty string when there is no
+pagination to show.
+
+Setting preferences in a config file
+====================================
+
+If you prefer not to set preferences using the above method, you can
+instead put them into a config file. Simply create a new file called
+pagination.php, add the $config array in that file. Then save the file
+in: config/pagination.php and it will be used automatically. You will
+NOT need to use the $this->pagination->initialize function if you save
+your preferences in a config file.
+
+**************************
+Customizing the Pagination
+**************************
+
+The following is a list of all the preferences you can pass to the
+initialization function to tailor the display.
+
+$config['uri_segment'] = 3;
+============================
+
+The pagination function automatically determines which segment of your
+URI contains the page number. If you need something different you can
+specify it.
+
+$config['num_links'] = 2;
+==========================
+
+The number of "digit" links you would like before and after the selected
+page number. For example, the number 2 will place two digits on either
+side, as in the example links at the very top of this page.
+
+$config['use_page_number'] = TRUE;
+==================================
+
+By default, the URI segment will use the starting index for the items
+you are paginating. If you prefer to show the the actual page number,
+set this to TRUE.
+
+$config['page_query_string'] = TRUE;
+====================================
+
+By default, the pagination library assume you are using :doc:`URI
+Segments <../general/urls>`, and constructs your links something
+like
+
+::
+
+	http://example.com/index.php/test/page/20
+
+
+If you have $config['enable_query_strings'] set to TRUE your links
+will automatically be re-written using Query Strings. This option can
+also be explictly set. Using $config['page_query_string'] set to TRUE,
+the pagination link will become.
+
+::
+
+	http://example.com/index.php?c=test&m=page&per_page=20
+
+
+Note that "per_page" is the default query string passed, however can be
+configured using $config['query_string_segment'] = 'your_string'
+
+***********************
+Adding Enclosing Markup
+***********************
+
+If you would like to surround the entire pagination with some markup you
+can do it with these two prefs:
+
+$config['full_tag_open'] = '<p>';
+===================================
+
+The opening tag placed on the left side of the entire result.
+
+$config['full_tag_close'] = '</p>';
+=====================================
+
+The closing tag placed on the right side of the entire result.
+
+**************************
+Customizing the First Link
+**************************
+
+$config['first_link'] = 'First';
+=================================
+
+The text you would like shown in the "first" link on the left. If you do
+not want this link rendered, you can set its value to FALSE.
+
+$config['first_tag_open'] = '<div>';
+======================================
+
+The opening tag for the "first" link.
+
+$config['first_tag_close'] = '</div>';
+========================================
+
+The closing tag for the "first" link.
+
+*************************
+Customizing the Last Link
+*************************
+
+$config['last_link'] = 'Last';
+===============================
+
+The text you would like shown in the "last" link on the right. If you do
+not want this link rendered, you can set its value to FALSE.
+
+$config['last_tag_open'] = '<div>';
+=====================================
+
+The opening tag for the "last" link.
+
+$config['last_tag_close'] = '</div>';
+=======================================
+
+The closing tag for the "last" link.
+
+***************************
+Customizing the "Next" Link
+***************************
+
+$config['next_link'] = '&gt;';
+===============================
+
+The text you would like shown in the "next" page link. If you do not
+want this link rendered, you can set its value to FALSE.
+
+$config['next_tag_open'] = '<div>';
+=====================================
+
+The opening tag for the "next" link.
+
+$config['next_tag_close'] = '</div>';
+=======================================
+
+The closing tag for the "next" link.
+
+*******************************
+Customizing the "Previous" Link
+*******************************
+
+$config['prev_link'] = '&lt;';
+===============================
+
+The text you would like shown in the "previous" page link. If you do not
+want this link rendered, you can set its value to FALSE.
+
+$config['prev_tag_open'] = '<div>';
+=====================================
+
+The opening tag for the "previous" link.
+
+$config['prev_tag_close'] = '</div>';
+=======================================
+
+The closing tag for the "previous" link.
+
+***********************************
+Customizing the "Current Page" Link
+***********************************
+
+$config['cur_tag_open'] = '<b>';
+==================================
+
+The opening tag for the "current" link.
+
+$config['cur_tag_close'] = '</b>';
+====================================
+
+The closing tag for the "current" link.
+
+****************************
+Customizing the "Digit" Link
+****************************
+
+$config['num_tag_open'] = '<div>';
+====================================
+
+The opening tag for the "digit" link.
+
+$config['num_tag_close'] = '</div>';
+======================================
+
+The closing tag for the "digit" link.
+
+****************
+Hiding the Pages
+****************
+
+If you wanted to not list the specific pages (for example, you only want
+"next" and "previous" links), you can suppress their rendering by
+adding::
+
+	 $config['display_pages'] = FALSE;
+
+******************************
+Adding a class to every anchor
+******************************
+
+If you want to add a class attribute to every link rendered by the
+pagination class, you can set the config "anchor_class" equal to the
+classname you want.
diff --git a/user_guide_src/source/libraries/parser.rst b/user_guide_src/source/libraries/parser.rst
new file mode 100644
index 0000000..64ec5c0
--- /dev/null
+++ b/user_guide_src/source/libraries/parser.rst
@@ -0,0 +1,92 @@
+#####################
+Template Parser Class
+#####################
+
+The Template Parser Class enables you to parse pseudo-variables
+contained within your view files. It can parse simple variables or
+variable tag pairs. If you've never used a template engine,
+pseudo-variables look like this::
+
+	<html> <head> <title>{blog_title}</title> </head> <body>  <h3>{blog_heading}</h3>  {blog_entries} <h5>{title}</h5> <p>{body}</p> {/blog_entries}  </body> </html>
+
+These variables are not actual PHP variables, but rather plain text
+representations that allow you to eliminate PHP from your templates
+(view files).
+
+.. note:: CodeIgniter does **not** require you to use this class since
+	using pure PHP in your view pages lets them run a little faster.
+	However, some developers prefer to use a template engine if they work
+	with designers who they feel would find some confusion working with PHP.
+
+.. important:: The Template Parser Class is **not** a full-blown
+	template parsing solution. We've kept it very lean on purpose in order
+	to maintain maximum performance.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the Parser class is initialized
+in your controller using the $this->load->library function::
+
+	$this->load->library('parser');
+
+Once loaded, the Parser library object will be available using:
+$this->parser
+
+The following functions are available in this library:
+
+$this->parser->parse()
+======================
+
+This method accepts a template name and data array as input, and it
+generates a parsed version. Example::
+
+	$this->load->library('parser');  $data = array(             'blog_title' => 'My Blog Title',             'blog_heading' => 'My Blog Heading'             );  $this->parser->parse('blog_template', $data);
+
+The first parameter contains the name of the :doc:`view
+file <../general/views>` (in this example the file would be called
+blog_template.php), and the second parameter contains an associative
+array of data to be replaced in the template. In the above example, the
+template would contain two variables: {blog_title} and {blog_heading}
+
+There is no need to "echo" or do something with the data returned by
+$this->parser->parse(). It is automatically passed to the output class
+to be sent to the browser. However, if you do want the data returned
+instead of sent to the output class you can pass TRUE (boolean) to the
+third parameter::
+
+	$string = $this->parser->parse('blog_template', $data, TRUE);
+
+$this->parser->parse_string()
+==============================
+
+This method works exactly like parse(), only accepts a string as the
+first parameter in place of a view file.
+
+Variable Pairs
+==============
+
+The above example code allows simple variables to be replaced. What if
+you would like an entire block of variables to be repeated, with each
+iteration containing new values? Consider the template example we showed
+at the top of the page::
+
+	<html> <head> <title>{blog_title}</title> </head> <body>  <h3>{blog_heading}</h3>  {blog_entries} <h5>{title}</h5> <p>{body}</p> {/blog_entries}  </body> </html>
+
+In the above code you'll notice a pair of variables: {blog_entries}
+data... {/blog_entries}. In a case like this, the entire chunk of data
+between these pairs would be repeated multiple times, corresponding to
+the number of rows in a result.
+
+Parsing variable pairs is done using the identical code shown above to
+parse single variables, except, you will add a multi-dimensional array
+corresponding to your variable pair data. Consider this example::
+
+	$this->load->library('parser');  $data = array(               'blog_title'   => 'My Blog Title',               'blog_heading' => 'My Blog Heading',               'blog_entries' => array(                                       array('title' => 'Title 1', 'body' => 'Body 1'),                                       array('title' => 'Title 2', 'body' => 'Body 2'),                                       array('title' => 'Title 3', 'body' => 'Body 3'),                                       array('title' => 'Title 4', 'body' => 'Body 4'),                                       array('title' => 'Title 5', 'body' => 'Body 5')                                       )             );  $this->parser->parse('blog_template', $data);
+
+If your "pair" data is coming from a database result, which is already a
+multi-dimensional array, you can simply use the database result_array()
+function::
+
+	 $query = $this->db->query("SELECT * FROM blog");  $this->load->library('parser');  $data = array(               'blog_title'   => 'My Blog Title',               'blog_heading' => 'My Blog Heading',               'blog_entries' => $query->result_array()             );  $this->parser->parse('blog_template', $data);
+
diff --git a/user_guide_src/source/libraries/security.rst b/user_guide_src/source/libraries/security.rst
new file mode 100644
index 0000000..340cf4d
--- /dev/null
+++ b/user_guide_src/source/libraries/security.rst
@@ -0,0 +1,90 @@
+##############
+Security Class
+##############
+
+The Security Class contains methods that help you create a secure
+application, processing input data for security.
+
+XSS Filtering
+=============
+
+CodeIgniter comes with a Cross Site Scripting Hack prevention filter
+which can either run automatically to filter all POST and COOKIE data
+that is encountered, or you can run it on a per item basis. By default
+it does **not** run globally since it requires a bit of processing
+overhead, and since you may not need it in all cases.
+
+The XSS filter looks for commonly used techniques to trigger Javascript
+or other types of code that attempt to hijack cookies or do other
+malicious things. If anything disallowed is encountered it is rendered
+safe by converting the data to character entities.
+
+Note: This function should only be used to deal with data upon
+submission. It's not something that should be used for general runtime
+processing since it requires a fair amount of processing overhead.
+
+To filter data through the XSS filter use this function:
+
+$this->security->xss_clean()
+=============================
+
+Here is an usage example::
+
+	$data = $this->security->xss_clean($data);
+
+If you want the filter to run automatically every time it encounters
+POST or COOKIE data you can enable it by opening your
+application/config/config.php file and setting this::
+
+	$config['global_xss_filtering'] = TRUE;
+
+Note: If you use the form validation class, it gives you the option of
+XSS filtering as well.
+
+An optional second parameter, is_image, allows this function to be used
+to test images for potential XSS attacks, useful for file upload
+security. When this second parameter is set to TRUE, instead of
+returning an altered string, the function returns TRUE if the image is
+safe, and FALSE if it contained potentially malicious information that a
+browser may attempt to execute.
+
+::
+
+	if ($this->security->xss_clean($file, TRUE) === FALSE) {     // file failed the XSS test }
+
+$this->security->sanitize_filename()
+=====================================
+
+When accepting filenames from user input, it is best to sanitize them to
+prevent directory traversal and other security related issues. To do so,
+use the sanitize_filename() method of the Security class. Here is an
+example::
+
+	$filename = $this->security->sanitize_filename($this->input->post('filename'));
+
+If it is acceptable for the user input to include relative paths, e.g.
+file/in/some/approved/folder.txt, you can set the second optional
+parameter, $relative_path to TRUE.
+
+::
+
+	$filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);
+
+Cross-site request forgery (CSRF)
+=================================
+
+You can enable csrf protection by opening your
+application/config/config.php file and setting this::
+
+	$config['csrf_protection'] = TRUE;
+
+If you use the :doc:`form helper <../helpers/form_helper>` the
+form_open() function will automatically insert a hidden csrf field in
+your forms.
+
+Select URIs can be whitelisted from csrf protection (for example API
+endpoints expecting externally POSTed content). You can add these URIs
+by editing the 'csrf_exclude_uris' config parameter::
+
+	$config['csrf_exclude_uris'] = array('api/person/add');
+
diff --git a/user_guide_src/source/libraries/sessions.rst b/user_guide_src/source/libraries/sessions.rst
new file mode 100644
index 0000000..4ae3ea2
--- /dev/null
+++ b/user_guide_src/source/libraries/sessions.rst
@@ -0,0 +1,317 @@
+#############
+Session Class
+#############
+
+The Session class permits you maintain a user's "state" and track their
+activity while they browse your site. The Session class stores session
+information for each user as serialized (and optionally encrypted) data
+in a cookie. It can also store the session data in a database table for
+added security, as this permits the session ID in the user's cookie to
+be matched against the stored session ID. By default only the cookie is
+saved. If you choose to use the database option you'll need to create
+the session table as indicated below.
+
+.. note:: The Session class does **not** utilize native PHP sessions. It
+	generates its own session data, offering more flexibility for
+	developers.
+
+.. note:: Even if you are not using encrypted sessions, you must set
+	an :doc:`encryption key <./encryption>` in your config file which is used
+	to aid in preventing session data manipulation.
+
+Initializing a Session
+======================
+
+Sessions will typically run globally with each page load, so the session
+class must either be :doc:`initialized <../general/libraries>` in your
+:doc:`controller <../general/controllers>` constructors, or it can be
+:doc:`auto-loaded <../general/autoloader>` by the system. For the most
+part the session class will run unattended in the background, so simply
+initializing the class will cause it to read, create, and update
+sessions.
+
+To initialize the Session class manually in your controller constructor,
+use the $this->load->library function::
+
+	$this->load->library('session');
+
+Once loaded, the Sessions library object will be available using:
+$this->session
+
+How do Sessions work?
+=====================
+
+When a page is loaded, the session class will check to see if valid
+session data exists in the user's session cookie. If sessions data does
+**not** exist (or if it has expired) a new session will be created and
+saved in the cookie. If a session does exist, its information will be
+updated and the cookie will be updated. With each update, the
+session_id will be regenerated.
+
+It's important for you to understand that once initialized, the Session
+class runs automatically. There is nothing you need to do to cause the
+above behavior to happen. You can, as you'll see below, work with
+session data or even add your own data to a user's session, but the
+process of reading, writing, and updating a session is automatic.
+
+What is Session Data?
+=====================
+
+A *session*, as far as CodeIgniter is concerned, is simply an array
+containing the following information:
+
+-  The user's unique Session ID (this is a statistically random string
+   with very strong entropy, hashed with MD5 for portability, and
+   regenerated (by default) every five minutes)
+-  The user's IP Address
+-  The user's User Agent data (the first 120 characters of the browser
+   data string)
+-  The "last activity" time stamp.
+
+The above data is stored in a cookie as a serialized array with this
+prototype::
+
+	[array] (      'session_id'    => random hash,      'ip_address'    => 'string - user IP address',      'user_agent'    => 'string - user agent data',      'last_activity' => timestamp )
+
+If you have the encryption option enabled, the serialized array will be
+encrypted before being stored in the cookie, making the data highly
+secure and impervious to being read or altered by someone. More info
+regarding encryption can be :doc:`found here <encryption>`, although
+the Session class will take care of initializing and encrypting the data
+automatically.
+
+Note: Session cookies are only updated every five minutes by default to
+reduce processor load. If you repeatedly reload a page you'll notice
+that the "last activity" time only updates if five minutes or more has
+passed since the last time the cookie was written. This time is
+configurable by changing the $config['sess_time_to_update'] line in
+your system/config/config.php file.
+
+Retrieving Session Data
+=======================
+
+Any piece of information from the session array is available using the
+following function::
+
+	$this->session->userdata('item');
+
+Where item is the array index corresponding to the item you wish to
+fetch. For example, to fetch the session ID you will do this::
+
+	$session_id = $this->session->userdata('session_id');
+
+.. note:: The function returns FALSE (boolean) if the item you are
+	trying to access does not exist.
+
+Adding Custom Session Data
+==========================
+
+A useful aspect of the session array is that you can add your own data
+to it and it will be stored in the user's cookie. Why would you want to
+do this? Here's one example:
+
+Let's say a particular user logs into your site. Once authenticated, you
+could add their username and email address to the session cookie, making
+that data globally available to you without having to run a database
+query when you need it.
+
+To add your data to the session array involves passing an array
+containing your new data to this function::
+
+	$this->session->set_userdata($array);
+
+Where $array is an associative array containing your new data. Here's an
+example::
+
+	$newdata = array(                        'username'  => 'johndoe',                        'email'     => 'johndoe@some-site.com',                        'logged_in' => TRUE                    );          $this->session->set_userdata($newdata);
+
+
+If you want to add userdata one value at a time, set_userdata() also
+supports this syntax.
+
+::
+
+	$this->session->set_userdata('some_name', 'some_value');
+
+
+.. note:: Cookies can only hold 4KB of data, so be careful not to exceed
+	the capacity. The encryption process in particular produces a longer
+	data string than the original so keep careful track of how much data you
+	are storing.
+
+Retrieving All Session Data
+===========================
+
+An array of all userdata can be retrieved as follows::
+
+	$this->session->all_userdata()
+
+And returns an associative array like the following::
+
+
+    Array
+    (
+        [session_id] => 4a5a5dca22728fb0a84364eeb405b601
+        [ip_address] => 127.0.0.1
+        [user_agent] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7;
+        [last_activity] => 1303142623
+    )
+
+Removing Session Data
+=====================
+
+Just as set_userdata() can be used to add information into a session,
+unset_userdata() can be used to remove it, by passing the session key.
+For example, if you wanted to remove 'some_name' from your session
+information::
+
+	$this->session->unset_userdata('some_name');
+
+
+This function can also be passed an associative array of items to unset.
+
+::
+
+	$array_items = array('username' => '', 'email' => '');  $this->session->unset_userdata($array_items);
+
+
+Flashdata
+=========
+
+CodeIgniter supports "flashdata", or session data that will only be
+available for the next server request, and are then automatically
+cleared. These can be very useful, and are typically used for
+informational or status messages (for example: "record 2 deleted").
+
+Note: Flash variables are prefaced with "flash\_" so avoid this prefix
+in your own session names.
+
+To add flashdata::
+
+	$this->session->set_flashdata('item', 'value');
+
+
+You can also pass an array to set_flashdata(), in the same manner as
+set_userdata().
+
+To read a flashdata variable::
+
+	$this->session->flashdata('item');
+
+
+If you find that you need to preserve a flashdata variable through an
+additional request, you can do so using the keep_flashdata() function.
+
+::
+
+	$this->session->keep_flashdata('item');
+
+
+Saving Session Data to a Database
+=================================
+
+While the session data array stored in the user's cookie contains a
+Session ID, unless you store session data in a database there is no way
+to validate it. For some applications that require little or no
+security, session ID validation may not be needed, but if your
+application requires security, validation is mandatory. Otherwise, an
+old session could be restored by a user modifying their cookies.
+
+When session data is available in a database, every time a valid session
+is found in the user's cookie, a database query is performed to match
+it. If the session ID does not match, the session is destroyed. Session
+IDs can never be updated, they can only be generated when a new session
+is created.
+
+In order to store sessions, you must first create a database table for
+this purpose. Here is the basic prototype (for MySQL) required by the
+session class:
+
+CREATE TABLE IF NOT EXISTS \`ci_sessions\` ( session_id varchar(40)
+DEFAULT '0' NOT NULL, ip_address varchar(16) DEFAULT '0' NOT NULL,
+user_agent varchar(120) NOT NULL, last_activity int(10) unsigned
+DEFAULT 0 NOT NULL, user_data text NOT NULL, PRIMARY KEY (session_id),
+KEY \`last_activity_idx\` (\`last_activity\`) );
+
+.. note:: By default the table is called ci_sessions, but you can name
+	it anything you want as long as you update the
+	application/config/config.php file so that it contains the name you have
+	chosen. Once you have created your database table you can enable the
+	database option in your config.php file as follows::
+
+		$config['sess_use_database'] = TRUE;
+
+	Once enabled, the Session class will store session data in the DB.
+
+	Make sure you've specified the table name in your config file as well::
+
+		$config['sess_table_name'] = 'ci_sessions';
+
+.. note:: The Session class has built-in garbage collection which clears
+	out expired sessions so you do not need to write your own routine to do
+	it.
+
+Destroying a Session
+====================
+
+To clear the current session::
+
+	$this->session->sess_destroy();
+
+.. note:: This function should be the last one called, and even flash
+	variables will no longer be available. If you only want some items
+	destroyed and not all, use unset_userdata().
+
+Session Preferences
+===================
+
+You'll find the following Session related preferences in your
+application/config/config.php file:
+
+Preference
+Default
+Options
+Description
+**sess_cookie_name**
+ci_session
+None
+The name you want the session cookie saved as.
+**sess_expiration**
+7200
+None
+The number of seconds you would like the session to last. The default
+value is 2 hours (7200 seconds). If you would like a non-expiring
+session set the value to zero: 0
+**sess_expire_on_close**
+FALSE
+TRUE/FALSE (boolean)
+Whether to cause the session to expire automatically when the browser
+window is closed.
+**sess_encrypt_cookie**
+FALSE
+TRUE/FALSE (boolean)
+Whether to encrypt the session data.
+**sess_use_database**
+FALSE
+TRUE/FALSE (boolean)
+Whether to save the session data to a database. You must create the
+table before enabling this option.
+**sess_table_name**
+ci_sessions
+Any valid SQL table name
+The name of the session database table.
+**sess_time_to_update**
+300
+Time in seconds
+This options controls how often the session class will regenerate itself
+and create a new session id.
+**sess_match_ip**
+FALSE
+TRUE/FALSE (boolean)
+Whether to match the user's IP address when reading the session data.
+Note that some ISPs dynamically changes the IP, so if you want a
+non-expiring session you will likely set this to FALSE.
+**sess_match_useragent**
+TRUE
+TRUE/FALSE (boolean)
+Whether to match the User Agent when reading the session data.
diff --git a/user_guide_src/source/libraries/table.rst b/user_guide_src/source/libraries/table.rst
new file mode 100644
index 0000000..6ca6bc9
--- /dev/null
+++ b/user_guide_src/source/libraries/table.rst
@@ -0,0 +1,170 @@
+################
+HTML Table Class
+################
+
+The Table Class provides functions that enable you to auto-generate HTML
+tables from arrays or database result sets.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the Table class is initialized
+in your controller using the $this->load->library function::
+
+	$this->load->library('table');
+
+Once loaded, the Table library object will be available using:
+$this->table
+
+Examples
+========
+
+Here is an example showing how you can create a table from a
+multi-dimensional array. Note that the first array index will become the
+table heading (or you can set your own headings using the set_heading()
+function described in the function reference below).
+
+::
+
+	 $this->load->library('table');  $data = array(              array('Name', 'Color', 'Size'),              array('Fred', 'Blue', 'Small'),              array('Mary', 'Red', 'Large'),              array('John', 'Green', 'Medium')                );  echo $this->table->generate($data);
+
+Here is an example of a table created from a database query result. The
+table class will automatically generate the headings based on the table
+names (or you can set your own headings using the set_heading()
+function described in the function reference below).
+
+::
+
+	 $this->load->library('table');  $query = $this->db->query("SELECT * FROM my_table");  echo $this->table->generate($query);
+
+Here is an example showing how you might create a table using discrete
+parameters::
+
+	 $this->load->library('table');  $this->table->set_heading('Name', 'Color', 'Size');  $this->table->add_row('Fred', 'Blue', 'Small'); $this->table->add_row('Mary', 'Red', 'Large'); $this->table->add_row('John', 'Green', 'Medium');  echo $this->table->generate();
+
+Here is the same example, except instead of individual parameters,
+arrays are used::
+
+	 $this->load->library('table');  $this->table->set_heading(array('Name', 'Color', 'Size'));  $this->table->add_row(array('Fred', 'Blue', 'Small')); $this->table->add_row(array('Mary', 'Red', 'Large')); $this->table->add_row(array('John', 'Green', 'Medium'));  echo $this->table->generate();
+
+Changing the Look of Your Table
+===============================
+
+The Table Class permits you to set a table template with which you can
+specify the design of your layout. Here is the template prototype::
+
+	 $tmpl =  array (                     'table_open'          => '<table border="0" cellpadding="4" cellspacing="0">',                      'heading_row_start'   => '<tr>',                     'heading_row_end'     => '</tr>',                     'heading_cell_start'  => '<th>',                     'heading_cell_end'    => '</th>',                      'row_start'           => '<tr>',                     'row_end'             => '</tr>',                     'cell_start'          => '<td>',                     'cell_end'            => '</td>',                      'row_alt_start'       => '<tr>',                     'row_alt_end'         => '</tr>',                     'cell_alt_start'      => '<td>',                     'cell_alt_end'        => '</td>',                      'table_close'         => '</table>'               );   $this->table->set_template($tmpl);
+
+.. note:: You'll notice there are two sets of "row" blocks in the
+	template. These permit you to create alternating row colors or design
+	elements that alternate with each iteration of the row data.
+
+You are NOT required to submit a complete template. If you only need to
+change parts of the layout you can simply submit those elements. In this
+example, only the table opening tag is being changed::
+
+	 $tmpl =  array ( 'table_open'  => '<table border="1" cellpadding="2" cellspacing="1" class="mytable">' );   $this->table->set_template($tmpl);
+
+******************
+Function Reference
+******************
+
+$this->table->generate()
+========================
+
+Returns a string containing the generated table. Accepts an optional
+parameter which can be an array or a database result object.
+
+$this->table->set_caption()
+============================
+
+Permits you to add a caption to the table.
+
+::
+
+	$this->table->set_caption('Colors');
+
+$this->table->set_heading()
+============================
+
+Permits you to set the table heading. You can submit an array or
+discrete params::
+
+	$this->table->set_heading('Name', 'Color', 'Size');
+
+::
+
+	$this->table->set_heading(array('Name', 'Color', 'Size'));
+
+$this->table->add_row()
+========================
+
+Permits you to add a row to your table. You can submit an array or
+discrete params::
+
+	$this->table->add_row('Blue', 'Red', 'Green');
+
+::
+
+	$this->table->add_row(array('Blue', 'Red', 'Green'));
+
+If you would like to set an individual cell's tag attributes, you can
+use an associative array for that cell. The associative key 'data'
+defines the cell's data. Any other key => val pairs are added as
+key='val' attributes to the tag::
+
+	$cell = array('data' => 'Blue', 'class' => 'highlight', 'colspan' => 2); $this->table->add_row($cell, 'Red', 'Green');  // generates // <td class='highlight' colspan='2'>Blue</td><td>Red</td><td>Green</td>
+
+$this->table->make_columns()
+=============================
+
+This function takes a one-dimensional array as input and creates a
+multi-dimensional array with a depth equal to the number of columns
+desired. This allows a single array with many elements to be displayed
+in a table that has a fixed column count. Consider this example::
+
+	 $list = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve');  $new_list = $this->table->make_columns($list, 3);  $this->table->generate($new_list);  // Generates a table with this prototype  <table border="0" cellpadding="4" cellspacing="0"> <tr> <td>one</td><td>two</td><td>three</td> </tr><tr> <td>four</td><td>five</td><td>six</td> </tr><tr> <td>seven</td><td>eight</td><td>nine</td> </tr><tr> <td>ten</td><td>eleven</td><td>twelve</td></tr> </table>
+
+$this->table->set_template()
+=============================
+
+Permits you to set your template. You can submit a full or partial
+template.
+
+::
+
+	 $tmpl =  array ( 'table_open'  => '<table border="1" cellpadding="2" cellspacing="1" class="mytable">' );   $this->table->set_template($tmpl);
+
+$this->table->set_empty()
+==========================
+
+Let's you set a default value for use in any table cells that are empty.
+You might, for example, set a non-breaking space::
+
+	 $this->table->set_empty("&nbsp;");
+
+$this->table->clear()
+=====================
+
+Lets you clear the table heading and row data. If you need to show
+multiple tables with different data you should to call this function
+after each table has been generated to empty the previous table
+information. Example::
+
+	 $this->load->library('table');  $this->table->set_heading('Name', 'Color', 'Size'); $this->table->add_row('Fred', 'Blue', 'Small'); $this->table->add_row('Mary', 'Red', 'Large'); $this->table->add_row('John', 'Green', 'Medium');  echo $this->table->generate();  $this->table->clear();  $this->table->set_heading('Name', 'Day', 'Delivery'); $this->table->add_row('Fred', 'Wednesday', 'Express'); $this->table->add_row('Mary', 'Monday', 'Air'); $this->table->add_row('John', 'Saturday', 'Overnight');  echo $this->table->generate();
+
+$this->table->function
+======================
+
+Allows you to specify a native PHP function or a valid function array
+object to be applied to all cell data.
+
+::
+
+	$this->load->library('table');  $this->table->set_heading('Name', 'Color', 'Size'); $this->table->add_row('Fred', '<strong>Blue</strong>', 'Small');  $this->table->function = 'htmlspecialchars'; echo $this->table->generate();
+
+In the above example, all cell data would be ran through PHP's
+htmlspecialchars() function, resulting in::
+
+	<td>Fred</td><td>&lt;strong&gt;Blue&lt;/strong&gt;</td><td>Small</td>
+
diff --git a/user_guide_src/source/libraries/trackback.rst b/user_guide_src/source/libraries/trackback.rst
new file mode 100644
index 0000000..6b33278
--- /dev/null
+++ b/user_guide_src/source/libraries/trackback.rst
@@ -0,0 +1,149 @@
+###############
+Trackback Class
+###############
+
+The Trackback Class provides functions that enable you to send and
+receive Trackback data.
+
+If you are not familiar with Trackbacks you'll find more information
+`here <http://en.wikipedia.org/wiki/Trackback>`_.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the Trackback class is
+initialized in your controller using the $this->load->library function::
+
+	$this->load->library('trackback');
+
+Once loaded, the Trackback library object will be available using:
+$this->trackback
+
+Sending Trackbacks
+==================
+
+A Trackback can be sent from any of your controller functions using code
+similar to this example::
+
+	$this->load->library('trackback');  $tb_data = array(                 'ping_url'  => 'http://example.com/trackback/456',                 'url'       => 'http://www.my-example.com/blog/entry/123',                 'title'     => 'The Title of My Entry',                 'excerpt'   => 'The entry content.',                 'blog_name' => 'My Blog Name',                 'charset'   => 'utf-8'                 );  if ( ! $this->trackback->send($tb_data)) {      echo $this->trackback->display_errors(); } else {      echo 'Trackback was sent!'; }
+
+Description of array data:
+
+-  **ping_url** - The URL of the site you are sending the Trackback to.
+   You can send Trackbacks to multiple URLs by separating each URL with
+   a comma.
+-  **url** - The URL to YOUR site where the weblog entry can be seen.
+-  **title** - The title of your weblog entry.
+-  **excerpt** - The content of your weblog entry. Note: the Trackback
+   class will automatically send only the first 500 characters of your
+   entry. It will also strip all HTML.
+-  **blog_name** - The name of your weblog.
+-  **charset** - The character encoding your weblog is written in. If
+   omitted, UTF-8 will be used.
+
+The Trackback sending function returns TRUE/FALSE (boolean) on success
+or failure. If it fails, you can retrieve the error message using::
+
+	$this->trackback->display_errors();
+
+Receiving Trackbacks
+====================
+
+Before you can receive Trackbacks you must create a weblog. If you don't
+have a blog yet there's no point in continuing.
+
+Receiving Trackbacks is a little more complex than sending them, only
+because you will need a database table in which to store them, and you
+will need to validate the incoming trackback data. You are encouraged to
+implement a thorough validation process to guard against spam and
+duplicate data. You may also want to limit the number of Trackbacks you
+allow from a particular IP within a given span of time to further
+curtail spam. The process of receiving a Trackback is quite simple; the
+validation is what takes most of the effort.
+
+Your Ping URL
+=============
+
+In order to accept Trackbacks you must display a Trackback URL next to
+each one of your weblog entries. This will be the URL that people will
+use to send you Trackbacks (we will refer to this as your "Ping URL").
+
+Your Ping URL must point to a controller function where your Trackback
+receiving code is located, and the URL must contain the ID number for
+each particular entry, so that when the Trackback is received you'll be
+able to associate it with a particular entry.
+
+For example, if your controller class is called Trackback, and the
+receiving function is called receive, your Ping URLs will look something
+like this::
+
+	http://example.com/index.php/trackback/receive/entry_id
+
+Where entry_id represents the individual ID number for each of your
+entries.
+
+Creating a Trackback Table
+==========================
+
+Before you can receive Trackbacks you must create a table in which to
+store them. Here is a basic prototype for such a table:
+
+CREATE TABLE trackbacks ( tb_id int(10) unsigned NOT NULL
+auto_increment, entry_id int(10) unsigned NOT NULL default 0, url
+varchar(200) NOT NULL, title varchar(100) NOT NULL, excerpt text NOT
+NULL, blog_name varchar(100) NOT NULL, tb_date int(10) NOT NULL,
+ip_address varchar(16) NOT NULL, PRIMARY KEY \`tb_id\` (\`tb_id\`),
+KEY \`entry_id\` (\`entry_id\`) );
+The Trackback specification only requires four pieces of information to
+be sent in a Trackback (url, title, excerpt, blog_name), but to make
+the data more useful we've added a few more fields in the above table
+schema (date, IP address, etc.).
+
+Processing a Trackback
+======================
+
+Here is an example showing how you will receive and process a Trackback.
+The following code is intended for use within the controller function
+where you expect to receive Trackbacks.
+
+::
+
+	$this->load->library('trackback'); $this->load->database();  if ($this->uri->segment(3) == FALSE) {     $this->trackback->send_error("Unable to determine the entry ID"); }  if ( ! $this->trackback->receive()) {     $this->trackback->send_error("The Trackback did not contain valid data"); }  $data = array(                 'tb_id'      => '',                 'entry_id'   => $this->uri->segment(3),                 'url'        => $this->trackback->data('url'),                 'title'      => $this->trackback->data('title'),                 'excerpt'    => $this->trackback->data('excerpt'),                 'blog_name'  => $this->trackback->data('blog_name'),                 'tb_date'    => time(),                 'ip_address' => $this->input->ip_address()                 );  $sql = $this->db->insert_string('trackbacks', $data); $this->db->query($sql);  $this->trackback->send_success();
+
+Notes:
+^^^^^^
+
+The entry ID number is expected in the third segment of your URL. This
+is based on the URI example we gave earlier::
+
+	http://example.com/index.php/trackback/receive/entry_id
+
+Notice the entry_id is in the third URI segment, which you can retrieve
+using::
+
+	$this->uri->segment(3);
+
+In our Trackback receiving code above, if the third segment is missing,
+we will issue an error. Without a valid entry ID, there's no reason to
+continue.
+
+The $this->trackback->receive() function is simply a validation function
+that looks at the incoming data and makes sure it contains the four
+pieces of data that are required (url, title, excerpt, blog_name). It
+returns TRUE on success and FALSE on failure. If it fails you will issue
+an error message.
+
+The incoming Trackback data can be retrieved using this function::
+
+	$this->trackback->data('item')
+
+Where item represents one of these four pieces of info: url, title,
+excerpt, or blog_name
+
+If the Trackback data is successfully received, you will issue a success
+message using::
+
+	$this->trackback->send_success();
+
+.. note:: The above code contains no data validation, which you are
+	encouraged to add.
diff --git a/user_guide_src/source/libraries/typography.rst b/user_guide_src/source/libraries/typography.rst
new file mode 100644
index 0000000..ecda5d7
--- /dev/null
+++ b/user_guide_src/source/libraries/typography.rst
@@ -0,0 +1,104 @@
+################
+Typography Class
+################
+
+The Typography Class provides functions that help you format text.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the Typography class is
+initialized in your controller using the $this->load->library function::
+
+	$this->load->library('typography');
+
+Once loaded, the Typography library object will be available using:
+$this->typography
+
+auto_typography()
+==================
+
+Formats text so that it is semantically and typographically correct
+HTML. Takes a string as input and returns it with the following
+formatting:
+
+-  Surrounds paragraphs within <p></p> (looks for double line breaks to
+   identify paragraphs).
+-  Single line breaks are converted to <br />, except those that appear
+   within <pre> tags.
+-  Block level elements, like <div> tags, are not wrapped within
+   paragraphs, but their contained text is if it contains paragraphs.
+-  Quotes are converted to correctly facing curly quote entities, except
+   those that appear within tags.
+-  Apostrophes are converted to curly apostrophe entities.
+-  Double dashes (either like -- this or like--this) are converted to
+   em—dashes.
+-  Three consecutive periods either preceding or following a word are
+   converted to ellipsis…
+-  Double spaces following sentences are converted to non-breaking
+   spaces to mimic double spacing.
+
+Usage example::
+
+	$string = $this->typography->auto_typography($string);
+
+Parameters
+----------
+
+There is one optional parameters that determines whether the parser
+should reduce more then two consecutive line breaks down to two. Use
+boolean TRUE or FALSE.
+
+By default the parser does not reduce line breaks. In other words, if no
+parameters are submitted, it is the same as doing this::
+
+	$string = $this->typography->auto_typography($string, FALSE);
+
+.. note:: Typographic formatting can be processor intensive,
+	particularly if you have a lot of content being formatted. If you choose
+	to use this function you may want to consider :doc:`caching <../general/caching>`
+	your pages.
+
+format_characters()
+====================
+
+This function is similar to the auto_typography function above, except
+that it only does character conversion:
+
+-  Quotes are converted to correctly facing curly quote entities, except
+   those that appear within tags.
+-  Apostrophes are converted to curly apostrophe entities.
+-  Double dashes (either like -- this or like--this) are converted to
+   em—dashes.
+-  Three consecutive periods either preceding or following a word are
+   converted to ellipsis…
+-  Double spaces following sentences are converted to non-breaking
+   spaces to mimic double spacing.
+
+Usage example::
+
+	$string = $this->typography->format_characters($string);
+
+nl2br_except_pre()
+====================
+
+Converts newlines to <br /> tags unless they appear within <pre> tags.
+This function is identical to the native PHP nl2br() function, except
+that it ignores <pre> tags.
+
+Usage example::
+
+	$string = $this->typography->nl2br_except_pre($string);
+
+protect_braced_quotes
+=======================
+
+When using the Typography library in conjunction with the Template
+Parser library it can often be desirable to protect single and double
+quotes within curly braces. To enable this, set the
+protect_braced_quotes class property to TRUE.
+
+Usage example::
+
+	$this->load->library('typography'); $this->typography->protect_braced_quotes = TRUE;
+
diff --git a/user_guide_src/source/libraries/unit_testing.rst b/user_guide_src/source/libraries/unit_testing.rst
new file mode 100644
index 0000000..8a80ab2
--- /dev/null
+++ b/user_guide_src/source/libraries/unit_testing.rst
@@ -0,0 +1,147 @@
+##################
+Unit Testing Class
+##################
+
+Unit testing is an approach to software development in which tests are
+written for each function in your application. If you are not familiar
+with the concept you might do a little googling on the subject.
+
+CodeIgniter's Unit Test class is quite simple, consisting of an
+evaluation function and two result functions. It's not intended to be a
+full-blown test suite but rather a simple mechanism to evaluate your
+code to determine if it is producing the correct data type and result.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the Unit Test class is
+initialized in your controller using the $this->load->library function::
+
+	$this->load->library('unit_test');
+
+Once loaded, the Unit Test object will be available using: $this->unit
+
+Running Tests
+=============
+
+Running a test involves supplying a test and an expected result to the
+following function:
+
+$this->unit->run( test, expected result, 'test name', 'notes');
+===============================================================
+
+Where test is the result of the code you wish to test, expected result
+is the data type you expect, test name is an optional name you can give
+your test, and notes are optional notes. Example::
+
+	$test = 1 + 1;  $expected_result = 2;  $test_name = 'Adds one plus one';  $this->unit->run($test, $expected_result, $test_name);
+
+The expected result you supply can either be a literal match, or a data
+type match. Here's an example of a literal::
+
+	$this->unit->run('Foo', 'Foo');
+
+Here is an example of a data type match::
+
+	$this->unit->run('Foo', 'is_string');
+
+Notice the use of "is_string" in the second parameter? This tells the
+function to evaluate whether your test is producing a string as the
+result. Here is a list of allowed comparison types:
+
+-  is_object
+-  is_string
+-  is_bool
+-  is_true
+-  is_false
+-  is_int
+-  is_numeric
+-  is_float
+-  is_double
+-  is_array
+-  is_null
+
+Generating Reports
+==================
+
+You can either display results after each test, or your can run several
+tests and generate a report at the end. To show a report directly simply
+echo or return the run function::
+
+	echo $this->unit->run($test, $expected_result);
+
+To run a full report of all tests, use this::
+
+	echo $this->unit->report();
+
+The report will be formatted in an HTML table for viewing. If you prefer
+the raw data you can retrieve an array using::
+
+	echo $this->unit->result();
+
+Strict Mode
+===========
+
+By default the unit test class evaluates literal matches loosely.
+Consider this example::
+
+	$this->unit->run(1, TRUE);
+
+The test is evaluating an integer, but the expected result is a boolean.
+PHP, however, due to it's loose data-typing will evaluate the above code
+as TRUE using a normal equality test::
+
+	if (1 == TRUE) echo 'This evaluates as true';
+
+If you prefer, you can put the unit test class in to strict mode, which
+will compare the data type as well as the value::
+
+	if (1 === TRUE) echo 'This evaluates as FALSE';
+
+To enable strict mode use this::
+
+	$this->unit->use_strict(TRUE);
+
+Enabling/Disabling Unit Testing
+===============================
+
+If you would like to leave some testing in place in your scripts, but
+not have it run unless you need it, you can disable unit testing using::
+
+	$this->unit->active(FALSE)
+
+Unit Test Display
+=================
+
+When your unit test results display, the following items show by
+default:
+
+-  Test Name (test_name)
+-  Test Datatype (test_datatype)
+-  Expected Datatype (res_datatype)
+-  Result (result)
+-  File Name (file)
+-  Line Number (line)
+-  Any notes you entered for the test (notes)
+
+You can customize which of these items get displayed by using
+$this->unit->set_items(). For example, if you only wanted the test name
+and the result displayed:
+Customizing displayed tests
+---------------------------
+
+::
+
+	     $this->unit->set_test_items(array('test_name', 'result'));
+
+Creating a Template
+-------------------
+
+If you would like your test results formatted differently then the
+default you can set your own template. Here is an example of a simple
+template. Note the required pseudo-variables::
+
+	 $str = ' <table border="0" cellpadding="4" cellspacing="1">     {rows}         <tr>         <td>{item}</td>         <td>{result}</td>         </tr>     {/rows} </table>';  $this->unit->set_template($str);
+
+.. note:: Your template must be declared **before** running the unit
+	test process.
diff --git a/user_guide_src/source/libraries/uri.rst b/user_guide_src/source/libraries/uri.rst
new file mode 100644
index 0000000..2bbd829
--- /dev/null
+++ b/user_guide_src/source/libraries/uri.rst
@@ -0,0 +1,160 @@
+#########
+URI Class
+#########
+
+The URI Class provides functions that help you retrieve information from
+your URI strings. If you use URI routing, you can also retrieve
+information about the re-routed segments.
+
+.. note:: This class is initialized automatically by the system so there
+	is no need to do it manually.
+
+$this->uri->segment(n)
+======================
+
+Permits you to retrieve a specific segment. Where n is the segment
+number you wish to retrieve. Segments are numbered from left to right.
+For example, if your full URL is this::
+
+	http://example.com/index.php/news/local/metro/crime_is_up
+
+The segment numbers would be this:
+
+#. news
+#. local
+#. metro
+#. crime_is_up
+
+By default the function returns FALSE (boolean) if the segment does not
+exist. There is an optional second parameter that permits you to set
+your own default value if the segment is missing. For example, this
+would tell the function to return the number zero in the event of
+failure::
+
+	$product_id = $this->uri->segment(3, 0);
+
+It helps avoid having to write code like this::
+
+	if ($this->uri->segment(3) === FALSE) {     $product_id = 0; } else {     $product_id = $this->uri->segment(3); }
+
+$this->uri->rsegment(n)
+=======================
+
+This function is identical to the previous one, except that it lets you
+retrieve a specific segment from your re-routed URI in the event you are
+using CodeIgniter's :doc:`URI Routing <../general/routing>` feature.
+
+$this->uri->slash_segment(n)
+=============================
+
+This function is almost identical to $this->uri->segment(), except it
+adds a trailing and/or leading slash based on the second parameter. If
+the parameter is not used, a trailing slash added. Examples::
+
+	$this->uri->slash_segment(3); $this->uri->slash_segment(3, 'leading'); $this->uri->slash_segment(3, 'both');
+
+Returns:
+
+#. segment/
+#. /segment
+#. /segment/
+
+$this->uri->slash_rsegment(n)
+==============================
+
+This function is identical to the previous one, except that it lets you
+add slashes a specific segment from your re-routed URI in the event you
+are using CodeIgniter's :doc:`URI Routing <../general/routing>`
+feature.
+
+$this->uri->uri_to_assoc(n)
+=============================
+
+This function lets you turn URI segments into and associative array of
+key/value pairs. Consider this URI::
+
+	index.php/user/search/name/joe/location/UK/gender/male
+
+Using this function you can turn the URI into an associative array with
+this prototype::
+
+	[array] (     'name' => 'joe'     'location'  => 'UK'     'gender'    => 'male' )
+
+The first parameter of the function lets you set an offset. By default
+it is set to 3 since your URI will normally contain a
+controller/function in the first and second segments. Example::
+
+	 $array = $this->uri->uri_to_assoc(3);  echo $array['name'];
+
+The second parameter lets you set default key names, so that the array
+returned by the function will always contain expected indexes, even if
+missing from the URI. Example::
+
+	 $default = array('name', 'gender', 'location', 'type', 'sort');  $array = $this->uri->uri_to_assoc(3, $default);
+
+If the URI does not contain a value in your default, an array index will
+be set to that name, with a value of FALSE.
+
+Lastly, if a corresponding value is not found for a given key (if there
+is an odd number of URI segments) the value will be set to FALSE
+(boolean).
+
+$this->uri->ruri_to_assoc(n)
+==============================
+
+This function is identical to the previous one, except that it creates
+an associative array using the re-routed URI in the event you are using
+CodeIgniter's :doc:`URI Routing <../general/routing>` feature.
+
+$this->uri->assoc_to_uri()
+============================
+
+Takes an associative array as input and generates a URI string from it.
+The array keys will be included in the string. Example::
+
+	$array = array('product' => 'shoes', 'size' => 'large', 'color' => 'red');  $str = $this->uri->assoc_to_uri($array);  // Produces:  product/shoes/size/large/color/red
+
+$this->uri->uri_string()
+=========================
+
+Returns a string with the complete URI. For example, if this is your
+full URL::
+
+	http://example.com/index.php/news/local/345
+
+The function would return this::
+
+	/news/local/345
+
+$this->uri->ruri_string()
+==========================
+
+This function is identical to the previous one, except that it returns
+the re-routed URI in the event you are using CodeIgniter's :doc:`URI
+Routing <../general/routing>` feature.
+
+$this->uri->total_segments()
+=============================
+
+Returns the total number of segments.
+
+$this->uri->total_rsegments()
+==============================
+
+This function is identical to the previous one, except that it returns
+the total number of segments in your re-routed URI in the event you are
+using CodeIgniter's :doc:`URI Routing <../general/routing>` feature.
+
+$this->uri->segment_array()
+============================
+
+Returns an array containing the URI segments. For example::
+
+	 $segs = $this->uri->segment_array();  foreach ($segs as $segment) {     echo $segment;     echo '<br />'; }
+
+$this->uri->rsegment_array()
+=============================
+
+This function is identical to the previous one, except that it returns
+the array of segments in your re-routed URI in the event you are using
+CodeIgniter's :doc:`URI Routing <../general/routing>` feature.
diff --git a/user_guide_src/source/libraries/user_agent.rst b/user_guide_src/source/libraries/user_agent.rst
new file mode 100644
index 0000000..8099678
--- /dev/null
+++ b/user_guide_src/source/libraries/user_agent.rst
@@ -0,0 +1,150 @@
+################
+User Agent Class
+################
+
+The User Agent Class provides functions that help identify information
+about the browser, mobile device, or robot visiting your site. In
+addition you can get referrer information as well as language and
+supported character-set information.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the User Agent class is
+initialized in your controller using the $this->load->library function::
+
+	$this->load->library('user_agent');
+
+Once loaded, the object will be available using: $this->agent
+
+User Agent Definitions
+======================
+
+The user agent name definitions are located in a config file located at:
+application/config/user_agents.php. You may add items to the various
+user agent arrays if needed.
+
+Example
+=======
+
+When the User Agent class is initialized it will attempt to determine
+whether the user agent browsing your site is a web browser, a mobile
+device, or a robot. It will also gather the platform information if it
+is available.
+
+::
+
+	 $this->load->library('user_agent');  if ($this->agent->is_browser()) {     $agent  = $this->agent->browser().' '.$this->agent->version(); } elseif ($this->agent->is_robot()) {     $agent = $this->agent->robot(); } elseif ($this->agent->is_mobile()) {     $agent = $this->agent->mobile(); } else {     $agent = 'Unidentified User Agent'; }  echo $agent;  echo $this->agent->platform(); // Platform info (Windows, Linux, Mac, etc.)
+
+******************
+Function Reference
+******************
+
+$this->agent->is_browser()
+===========================
+
+Returns TRUE/FALSE (boolean) if the user agent is a known web browser.
+
+::
+
+	 if ($this->agent->is_browser('Safari')) {     echo 'You are using Safari.'; } else if ($this->agent->is_browser()) {     echo 'You are using a browser.'; }
+
+.. note:: The string "Safari" in this example is an array key in the
+	list of browser definitions. You can find this list in
+	application/config/user_agents.php if you want to add new browsers or
+	change the stings.
+
+$this->agent->is_mobile()
+==========================
+
+Returns TRUE/FALSE (boolean) if the user agent is a known mobile device.
+
+::
+
+	 if ($this->agent->is_mobile('iphone')) {     $this->load->view('iphone/home'); } else if ($this->agent->is_mobile()) {     $this->load->view('mobile/home'); } else {     $this->load->view('web/home'); }
+
+$this->agent->is_robot()
+=========================
+
+Returns TRUE/FALSE (boolean) if the user agent is a known robot.
+
+.. note:: The user agent library only contains the most common robot
+	definitions. It is not a complete list of bots. There are hundreds of
+	them so searching for each one would not be very efficient. If you find
+	that some bots that commonly visit your site are missing from the list
+	you can add them to your application/config/user_agents.php file.
+
+$this->agent->is_referral()
+============================
+
+Returns TRUE/FALSE (boolean) if the user agent was referred from another
+site.
+
+$this->agent->browser()
+=======================
+
+Returns a string containing the name of the web browser viewing your
+site.
+
+$this->agent->version()
+=======================
+
+Returns a string containing the version number of the web browser
+viewing your site.
+
+$this->agent->mobile()
+======================
+
+Returns a string containing the name of the mobile device viewing your
+site.
+
+$this->agent->robot()
+=====================
+
+Returns a string containing the name of the robot viewing your site.
+
+$this->agent->platform()
+========================
+
+Returns a string containing the platform viewing your site (Linux,
+Windows, OS X, etc.).
+
+$this->agent->referrer()
+========================
+
+The referrer, if the user agent was referred from another site.
+Typically you'll test for this as follows::
+
+	 if ($this->agent->is_referral()) {     echo $this->agent->referrer(); }
+
+$this->agent->agent_string()
+=============================
+
+Returns a string containing the full user agent string. Typically it
+will be something like this::
+
+	Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.4) Gecko/20060613 Camino/1.0.2
+
+$this->agent->accept_lang()
+============================
+
+Lets you determine if the user agent accepts a particular language.
+Example::
+
+	if ($this->agent->accept_lang('en')) {     echo 'You accept English!'; }
+
+.. note:: This function is not typically very reliable since some
+	browsers do not provide language info, and even among those that do, it
+	is not always accurate.
+
+$this->agent->accept_charset()
+===============================
+
+Lets you determine if the user agent accepts a particular character set.
+Example::
+
+	if ($this->agent->accept_charset('utf-8')) {     echo 'You browser supports UTF-8!'; }
+
+.. note:: This function is not typically very reliable since some
+	browsers do not provide character-set info, and even among those that
+	do, it is not always accurate.
diff --git a/user_guide_src/source/libraries/xmlrpc.rst b/user_guide_src/source/libraries/xmlrpc.rst
new file mode 100644
index 0000000..e25ba78
--- /dev/null
+++ b/user_guide_src/source/libraries/xmlrpc.rst
@@ -0,0 +1,400 @@
+##################################
+XML-RPC and XML-RPC Server Classes
+##################################
+
+CodeIgniter's XML-RPC classes permit you to send requests to another
+server, or set up your own XML-RPC server to receive requests.
+
+****************
+What is XML-RPC?
+****************
+
+Quite simply it is a way for two computers to communicate over the
+internet using XML. One computer, which we will call the client, sends
+an XML-RPC **request** to another computer, which we will call the
+server. Once the server receives and processes the request it will send
+back a **response** to the client.
+
+For example, using the MetaWeblog API, an XML-RPC Client (usually a
+desktop publishing tool) will send a request to an XML-RPC Server
+running on your site. This request might be a new weblog entry being
+sent for publication, or it could be a request for an existing entry for
+editing. When the XML-RPC Server receives this request it will examine
+it to determine which class/method should be called to process the
+request. Once processed, the server will then send back a response
+message.
+
+For detailed specifications, you can visit the
+`XML-RPC <http://www.xmlrpc.com/>`_ site.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the XML-RPC and XML-RPCS classes
+are initialized in your controller using the $this->load->library
+function:
+
+To load the XML-RPC class you will use::
+
+	$this->load->library('xmlrpc');
+
+Once loaded, the xml-rpc library object will be available using:
+$this->xmlrpc
+
+To load the XML-RPC Server class you will use::
+
+	 $this->load->library('xmlrpc'); $this->load->library('xmlrpcs');
+
+Once loaded, the xml-rpcs library object will be available using:
+$this->xmlrpcs
+
+.. note:: When using the XML-RPC Server class you must load BOTH the
+	XML-RPC class and the XML-RPC Server class.
+
+Sending XML-RPC Requests
+========================
+
+To send a request to an XML-RPC server you must specify the following
+information:
+
+-  The URL of the server
+-  The method on the server you wish to call
+-  The *request* data (explained below).
+
+Here is a basic example that sends a simple Weblogs.com ping to the
+`Ping-o-Matic <http://pingomatic.com/>`_
+
+::
+
+	$this->load->library('xmlrpc');  $this->xmlrpc->server('http://rpc.pingomatic.com/', 80); $this->xmlrpc->method('weblogUpdates.ping');   $request = array('My Photoblog', 'http://www.my-site.com/photoblog/'); $this->xmlrpc->request($request);  if ( ! $this->xmlrpc->send_request()) {     echo $this->xmlrpc->display_error(); }
+
+Explanation
+-----------
+
+The above code initializes the XML-RPC class, sets the server URL and
+method to be called (weblogUpdates.ping). The request (in this case, the
+title and URL of your site) is placed into an array for transportation,
+and compiled using the request() function. Lastly, the full request is
+sent. If the send_request() method returns false we will display the
+error message sent back from the XML-RPC Server.
+
+Anatomy of a Request
+====================
+
+An XML-RPC request is simply the data you are sending to the XML-RPC
+server. Each piece of data in a request is referred to as a request
+parameter. The above example has two parameters: The URL and title of
+your site. When the XML-RPC server receives your request, it will look
+for parameters it requires.
+
+Request parameters must be placed into an array for transportation, and
+each parameter can be one of seven data types (strings, numbers, dates,
+etc.). If your parameters are something other than strings you will have
+to include the data type in the request array.
+
+Here is an example of a simple array with three parameters::
+
+	$request = array('John', 'Doe', 'www.some-site.com'); $this->xmlrpc->request($request);
+
+If you use data types other than strings, or if you have several
+different data types, you will place each parameter into its own array,
+with the data type in the second position::
+
+	 $request = array (                    array('John', 'string'),                    array('Doe', 'string'),                    array(FALSE, 'boolean'),                    array(12345, 'int')                  );  $this->xmlrpc->request($request);
+
+The `Data Types <#datatypes>`_ section below has a full list of data
+types.
+Creating an XML-RPC Server
+==========================
+
+An XML-RPC Server acts as a traffic cop of sorts, waiting for incoming
+requests and redirecting them to the appropriate functions for
+processing.
+
+To create your own XML-RPC server involves initializing the XML-RPC
+Server class in your controller where you expect the incoming request to
+appear, then setting up an array with mapping instructions so that
+incoming requests can be sent to the appropriate class and method for
+processing.
+
+Here is an example to illustrate::
+
+	 $this->load->library('xmlrpc'); $this->load->library('xmlrpcs');  $config['functions']['new_post'] = array('function' => 'My_blog.new_entry'), $config['functions']['update_post'] = array('function' => 'My_blog.update_entry'); $config['object'] = $this;  $this->xmlrpcs->initialize($config); $this->xmlrpcs->serve();
+
+The above example contains an array specifying two method requests that
+the Server allows. The allowed methods are on the left side of the
+array. When either of those are received, they will be mapped to the
+class and method on the right.
+
+The 'object' key is a special key that you pass an instantiated class
+object with, which is necessary when the method you are mapping to is
+not part of the CodeIgniter super object.
+
+In other words, if an XML-RPC Client sends a request for the new_post
+method, your server will load the My_blog class and call the new_entry
+function. If the request is for the update_post method, your server
+will load the My_blog class and call the update_entry function.
+
+The function names in the above example are arbitrary. You'll decide
+what they should be called on your server, or if you are using
+standardized APIs, like the Blogger or MetaWeblog API, you'll use their
+function names.
+
+There are two additional configuration keys you may make use of when
+initializing the server class: debug can be set to TRUE in order to
+enable debugging, and xss_clean may be set to FALSE to prevent sending
+data through the Security library's xss_clean function.
+
+Processing Server Requests
+==========================
+
+When the XML-RPC Server receives a request and loads the class/method
+for processing, it will pass an object to that method containing the
+data sent by the client.
+
+Using the above example, if the new_post method is requested, the
+server will expect a class to exist with this prototype::
+
+	class My_blog extends CI_Controller {      function new_post($request)     {          } }
+
+The $request variable is an object compiled by the Server, which
+contains the data sent by the XML-RPC Client. Using this object you will
+have access to the *request parameters* enabling you to process the
+request. When you are done you will send a Response back to the Client.
+
+Below is a real-world example, using the Blogger API. One of the methods
+in the Blogger API is getUserInfo(). Using this method, an XML-RPC
+Client can send the Server a username and password, in return the Server
+sends back information about that particular user (nickname, user ID,
+email address, etc.). Here is how the processing function might look::
+
+	class My_blog extends CI_Controller {      function getUserInfo($request)     {          $username = 'smitty';         $password = 'secretsmittypass';          $this->load->library('xmlrpc');              $parameters = $request->output_parameters();              if ($parameters['1'] != $username AND $parameters['2'] != $password)         {             return $this->xmlrpc->send_error_message('100', 'Invalid Access');         }              $response = array(array('nickname'  => array('Smitty','string'),                                 'userid'    => array('99','string'),                                 'url'       => array('http://yoursite.com','string'),                                 'email'     => array('jsmith@yoursite.com','string'),                                 'lastname'  => array('Smith','string'),                                 'firstname' => array('John','string')                                 ),                          'struct');          return $this->xmlrpc->send_response($response);     } }
+
+Notes:
+------
+
+The output_parameters() function retrieves an indexed array
+corresponding to the request parameters sent by the client. In the above
+example, the output parameters will be the username and password.
+
+If the username and password sent by the client were not valid, and
+error message is returned using send_error_message().
+
+If the operation was successful, the client will be sent back a response
+array containing the user's info.
+
+Formatting a Response
+=====================
+
+Similar to *Requests*, *Responses* must be formatted as an array.
+However, unlike requests, a response is an array **that contains a
+single item**. This item can be an array with several additional arrays,
+but there can be only one primary array index. In other words, the basic
+prototype is this::
+
+	$response = array('Response data',  'array');
+
+Responses, however, usually contain multiple pieces of information. In
+order to accomplish this we must put the response into its own array so
+that the primary array continues to contain a single piece of data.
+Here's an example showing how this might be accomplished::
+
+	 $response = array (                    array(                          'first_name' => array('John', 'string'),                          'last_name' => array('Doe', 'string'),                          'member_id' => array(123435, 'int'),                          'todo_list' => array(array('clean house', 'call mom', 'water plants'), 'array'),                         ),                  'struct'                  );
+
+Notice that the above array is formatted as a struct. This is the most
+common data type for responses.
+
+As with Requests, a response can be one of the seven data types listed
+in the `Data Types <#datatypes>`_ section.
+
+Sending an Error Response
+=========================
+
+If you need to send the client an error response you will use the
+following::
+
+	return $this->xmlrpc->send_error_message('123', 'Requested data not available');
+
+The first parameter is the error number while the second parameter is
+the error message.
+
+Creating Your Own Client and Server
+===================================
+
+To help you understand everything we've covered thus far, let's create a
+couple controllers that act as XML-RPC Client and Server. You'll use the
+Client to send a request to the Server and receive a response.
+
+The Client
+----------
+
+Using a text editor, create a controller called xmlrpc_client.php. In
+it, place this code and save it to your applications/controllers/
+folder:
+
+<?php class Xmlrpc_client extends CI_Controller { function index() {
+$this->load->helper('url'); $server_url = site_url('xmlrpc_server');
+$this->load->library('xmlrpc'); $this->xmlrpc->server($server_url, 80);
+$this->xmlrpc->method('Greetings'); $request = array('How is it
+going?'); $this->xmlrpc->request($request); if ( !
+$this->xmlrpc->send_request()) { echo $this->xmlrpc->display_error();
+} else { echo '
+::
+
+    ';
+                print_r($this->xmlrpc->display_response());
+                echo '
+
+'; } } } ?>
+Note: In the above code we are using a "url helper". You can find more
+information in the :doc:`Helpers Functions <../general/helpers>` page.
+
+The Server
+----------
+
+Using a text editor, create a controller called xmlrpc_server.php. In
+it, place this code and save it to your applications/controllers/
+folder:
+
+<?php class Xmlrpc_server extends CI_Controller { function index() {
+$this->load->library('xmlrpc'); $this->load->library('xmlrpcs');
+$config['functions']['Greetings'] = array('function' =>
+'Xmlrpc_server.process'); $this->xmlrpcs->initialize($config);
+$this->xmlrpcs->serve(); } function process($request) { $parameters =
+$request->output_parameters(); $response = array( array( 'you_said' =>
+$parameters['0'], 'i_respond' => 'Not bad at all.'), 'struct'); return
+$this->xmlrpc->send_response($response); } } ?>
+Try it!
+-------
+
+Now visit the your site using a URL similar to this::
+
+	example.com/index.php/xmlrpc_client/
+
+You should now see the message you sent to the server, and its response
+back to you.
+
+The client you created sends a message ("How's is going?") to the
+server, along with a request for the "Greetings" method. The Server
+receives the request and maps it to the "process" function, where a
+response is sent back.
+
+Using Associative Arrays In a Request Parameter
+===============================================
+
+If you wish to use an associative array in your method parameters you
+will need to use a struct datatype::
+
+	$request = array(                      array(                            // Param 0                            array(                                  'name'=>'John'                                     ),                                  'struct'                            ),                            array(                                  // Param 1                                  array(                                           'size'=>'large',                                        'shape'=>'round'                                           ),                                  'struct'                            )                      );     $this->xmlrpc->request($request);
+
+You can retrieve the associative array when processing the request in
+the Server.
+
+::
+
+	$parameters = $request->output_parameters();     $name = $parameters['0']['name'];     $size = $parameters['1']['size'];     $size = $parameters['1']['shape']; 
+
+**************************
+XML-RPC Function Reference
+**************************
+
+$this->xmlrpc->server()
+=======================
+
+Sets the URL and port number of the server to which a request is to be
+sent::
+
+	$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);
+
+$this->xmlrpc->timeout()
+========================
+
+Set a time out period (in seconds) after which the request will be
+canceled::
+
+	$this->xmlrpc->timeout(6);
+
+$this->xmlrpc->method()
+=======================
+
+Sets the method that will be requested from the XML-RPC server::
+
+	$this->xmlrpc->method('method');
+
+Where method is the name of the method.
+
+$this->xmlrpc->request()
+========================
+
+Takes an array of data and builds request to be sent to XML-RPC server::
+
+	$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/'); $this->xmlrpc->request($request);
+
+$this->xmlrpc->send_request()
+==============================
+
+The request sending function. Returns boolean TRUE or FALSE based on
+success for failure, enabling it to be used conditionally.
+
+$this->xmlrpc->set_debug(TRUE);
+================================
+
+Enables debugging, which will display a variety of information and error
+data helpful during development.
+
+$this->xmlrpc->display_error()
+===============================
+
+Returns an error message as a string if your request failed for some
+reason.
+
+::
+
+	echo $this->xmlrpc->display_error();
+
+$this->xmlrpc->display_response()
+==================================
+
+Returns the response from the remote server once request is received.
+The response will typically be an associative array.
+
+::
+
+	$this->xmlrpc->display_response();
+
+$this->xmlrpc->send_error_message()
+=====================================
+
+This function lets you send an error message from your server to the
+client. First parameter is the error number while the second parameter
+is the error message.
+
+::
+
+	return $this->xmlrpc->send_error_message('123', 'Requested data not available');
+
+$this->xmlrpc->send_response()
+===============================
+
+Lets you send the response from your server to the client. An array of
+valid data values must be sent with this method.
+
+::
+
+	$response = array(                  array(                         'flerror' => array(FALSE, 'boolean'),                         'message' => "Thanks for the ping!"                      )                  'struct'); return $this->xmlrpc->send_response($response);
+
+Data Types
+==========
+
+According to the `XML-RPC spec <http://www.xmlrpc.com/spec>`_ there are
+seven types of values that you can send via XML-RPC:
+
+-  *int* or *i4*
+-  *boolean*
+-  *string*
+-  *double*
+-  *dateTime.iso8601*
+-  *base64*
+-  *struct* (contains array of values)
+-  *array* (contains array of values)
+
diff --git a/user_guide_src/source/libraries/zip.rst b/user_guide_src/source/libraries/zip.rst
new file mode 100644
index 0000000..59b41b9
--- /dev/null
+++ b/user_guide_src/source/libraries/zip.rst
@@ -0,0 +1,146 @@
+##################
+Zip Encoding Class
+##################
+
+CodeIgniter's Zip Encoding Class classes permit you to create Zip
+archives. Archives can be downloaded to your desktop or saved to a
+directory.
+
+Initializing the Class
+======================
+
+Like most other classes in CodeIgniter, the Zip class is initialized in
+your controller using the $this->load->library function::
+
+	$this->load->library('zip');
+
+Once loaded, the Zip library object will be available using: $this->zip
+
+Usage Example
+=============
+
+This example demonstrates how to compress a file, save it to a folder on
+your server, and download it to your desktop.
+
+::
+
+	 $name = 'mydata1.txt'; $data = 'A Data String!';  $this->zip->add_data($name, $data);  // Write the zip file to a folder on your server. Name it "my_backup.zip" $this->zip->archive('/path/to/directory/my_backup.zip');   // Download the file to your desktop.  Name it "my_backup.zip" $this->zip->download('my_backup.zip');
+
+******************
+Function Reference
+******************
+
+$this->zip->add_data()
+=======================
+
+Permits you to add data to the Zip archive. The first parameter must
+contain the name you would like given to the file, the second parameter
+must contain the file data as a string::
+
+	 $name = 'my_bio.txt'; $data = 'I was born in an elevator...';  $this->zip->add_data($name, $data);
+
+You are allowed multiple calls to this function in order to add several
+files to your archive. Example::
+
+	 $name = 'mydata1.txt'; $data = 'A Data String!'; $this->zip->add_data($name, $data);  $name = 'mydata2.txt'; $data = 'Another Data String!'; $this->zip->add_data($name, $data);
+
+Or you can pass multiple files using an array::
+
+	 $data = array(                 'mydata1.txt' => 'A Data String!',                 'mydata2.txt' => 'Another Data String!'             );  $this->zip->add_data($data);  $this->zip->download('my_backup.zip');
+
+If you would like your compressed data organized into sub-folders,
+include the path as part of the filename::
+
+	 $name = 'personal/my_bio.txt'; $data = 'I was born in an elevator...';  $this->zip->add_data($name, $data);
+
+The above example will place my_bio.txt inside a folder called
+personal.
+
+$this->zip->add_dir()
+======================
+
+Permits you to add a directory. Usually this function is unnecessary
+since you can place your data into folders when using
+$this->zip->add_data(), but if you would like to create an empty folder
+you can do so. Example::
+
+	$this->zip->add_dir('myfolder'); // Creates a folder called "myfolder"
+
+$this->zip->read_file()
+========================
+
+Permits you to compress a file that already exists somewhere on your
+server. Supply a file path and the zip class will read it and add it to
+the archive::
+
+	 $path = '/path/to/photo.jpg'; $this->zip->read_file($path);   // Download the file to your desktop.  Name it "my_backup.zip" $this->zip->download('my_backup.zip');
+
+If you would like the Zip archive to maintain the directory structure of
+the file in it, pass TRUE (boolean) in the second parameter. Example::
+
+	 $path = '/path/to/photo.jpg'; $this->zip->read_file($path, TRUE);   // Download the file to your desktop.  Name it "my_backup.zip" $this->zip->download('my_backup.zip');
+
+In the above example, photo.jpg will be placed inside two folders:
+path/to/
+
+$this->zip->read_dir()
+=======================
+
+Permits you to compress a folder (and its contents) that already exists
+somewhere on your server. Supply a file path to the directory and the
+zip class will recursively read it and recreate it as a Zip archive. All
+files contained within the supplied path will be encoded, as will any
+sub-folders contained within it. Example::
+
+	 $path = '/path/to/your/directory/'; $this->zip->read_dir($path);   // Download the file to your desktop.  Name it "my_backup.zip" $this->zip->download('my_backup.zip');
+
+By default the Zip archive will place all directories listed in the
+first parameter inside the zip. If you want the tree preceding the
+target folder to be ignored you can pass FALSE (boolean) in the second
+parameter. Example::
+
+	 $path = '/path/to/your/directory/'; $this->zip->read_dir($path, FALSE);
+
+This will create a ZIP with the folder "directory" inside, then all
+sub-folders stored correctly inside that, but will not include the
+folders /path/to/your.
+
+$this->zip->archive()
+=====================
+
+Writes the Zip-encoded file to a directory on your server. Submit a
+valid server path ending in the file name. Make sure the directory is
+writable (666 or 777 is usually OK). Example::
+
+	$this->zip->archive('/path/to/folder/myarchive.zip'); // Creates a file named myarchive.zip
+
+$this->zip->download()
+======================
+
+Causes the Zip file to be downloaded from your server. The function must
+be passed the name you would like the zip file called. Example::
+
+	$this->zip->download('latest_stuff.zip'); // File will be named "latest_stuff.zip"
+
+.. note:: Do not display any data in the controller in which you call
+	this function since it sends various server headers that cause the
+	download to happen and the file to be treated as binary.
+
+$this->zip->get_zip()
+======================
+
+Returns the Zip-compressed file data. Generally you will not need this
+function unless you want to do something unique with the data. Example::
+
+	 $name = 'my_bio.txt'; $data = 'I was born in an elevator...';  $this->zip->add_data($name, $data);  $zip_file = $this->zip->get_zip();
+
+$this->zip->clear_data()
+=========================
+
+The Zip class caches your zip data so that it doesn't need to recompile
+the Zip archive for each function you use above. If, however, you need
+to create multiple Zips, each with different data, you can clear the
+cache between calls. Example::
+
+	 $name = 'my_bio.txt'; $data = 'I was born in an elevator...';  $this->zip->add_data($name, $data); $zip_file = $this->zip->get_zip();  $this->zip->clear_data();   $name = 'photo.jpg'; $this->zip->read_file("/path/to/photo.jpg"); // Read the file's contents  $this->zip->download('myphotos.zip');
+
diff --git a/user_guide_src/source/license.rst b/user_guide_src/source/license.rst
new file mode 100644
index 0000000..bf689a0
--- /dev/null
+++ b/user_guide_src/source/license.rst
@@ -0,0 +1,62 @@
+#############################
+CodeIgniter License Agreement
+#############################
+
+Copyright (c) 2008 - 2011, EllisLab, Inc.
+All rights reserved.
+
+This license is a legal agreement between you and EllisLab Inc. for the
+use of CodeIgniter Software (the "Software"). By obtaining the Software
+you agree to comply with the terms and conditions of this license.
+
+Permitted Use
+=============
+
+You are permitted to use, copy, modify, and distribute the Software and
+its documentation, with or without modification, for any purpose,
+provided that the following conditions are met:
+
+#. A copy of this license agreement must be included with the
+   distribution.
+#. Redistributions of source code must retain the above copyright notice
+   in all source code files.
+#. Redistributions in binary form must reproduce the above copyright
+   notice in the documentation and/or other materials provided with the
+   distribution.
+#. Any files that have been modified must carry notices stating the
+   nature of the change and the names of those who changed them.
+#. Products derived from the Software must include an acknowledgment
+   that they are derived from CodeIgniter in their documentation and/or
+   other materials provided with the distribution.
+#. Products derived from the Software may not be called "CodeIgniter",
+   nor may "CodeIgniter" appear in their name, without prior written
+   permission from EllisLab, Inc.
+
+Indemnity
+=========
+
+You agree to indemnify and hold harmless the authors of the Software and
+any contributors for any direct, indirect, incidental, or consequential
+third-party claims, actions or suits, as well as any related expenses,
+liabilities, damages, settlements or fees arising from your use or
+misuse of the Software, or a violation of any terms of this license.
+
+Disclaimer of Warranty
+======================
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF
+QUALITY, PERFORMANCE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR
+A PARTICULAR PURPOSE.
+
+Limitations of Liability
+========================
+
+YOU ASSUME ALL RISK ASSOCIATED WITH THE INSTALLATION AND USE OF THE
+SOFTWARE. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS OF THE
+SOFTWARE BE LIABLE FOR CLAIMS, DAMAGES OR OTHER LIABILITY ARISING FROM,
+OUT OF, OR IN CONNECTION WITH THE SOFTWARE. LICENSE HOLDERS ARE SOLELY
+RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OF USE AND ASSUME ALL
+RISKS ASSOCIATED WITH ITS USE, INCLUDING BUT NOT LIMITED TO THE RISKS OF
+PROGRAM ERRORS, DAMAGE TO EQUIPMENT, LOSS OF DATA OR SOFTWARE PROGRAMS,
+OR UNAVAILABILITY OR INTERRUPTION OF OPERATIONS.
diff --git a/user_guide_src/source/overview/appflow.rst b/user_guide_src/source/overview/appflow.rst
new file mode 100644
index 0000000..bb15130
--- /dev/null
+++ b/user_guide_src/source/overview/appflow.rst
@@ -0,0 +1,23 @@
+######################
+Application Flow Chart
+######################
+
+The following graphic illustrates how data flows throughout the system:
+
+|CodeIgniter application flow|
+
+#. The index.php serves as the front controller, initializing the base
+   resources needed to run CodeIgniter.
+#. The Router examines the HTTP request to determine what should be done
+   with it.
+#. If a cache file exists, it is sent directly to the browser, bypassing
+   the normal system execution.
+#. Security. Before the application controller is loaded, the HTTP
+   request and any user submitted data is filtered for security.
+#. The Controller loads the model, core libraries, helpers, and any
+   other resources needed to process the specific request.
+#. The finalized View is rendered then sent to the web browser to be
+   seen. If caching is enabled, the view is cached first so that on
+   subsequent requests it can be served.
+
+.. |CodeIgniter application flow| image:: ../images/appflowchart.gif
diff --git a/user_guide_src/source/overview/at_a_glance.rst b/user_guide_src/source/overview/at_a_glance.rst
new file mode 100644
index 0000000..df4e3ca
--- /dev/null
+++ b/user_guide_src/source/overview/at_a_glance.rst
@@ -0,0 +1,106 @@
+#######################
+CodeIgniter at a Glance
+#######################
+
+CodeIgniter is an Application Framework
+=======================================
+
+CodeIgniter is a toolkit for people who build web applications using
+PHP. Its goal is to enable you to develop projects much faster than you
+could if you were writing code from scratch, by providing a rich set of
+libraries for commonly needed tasks, as well as a simple interface and
+logical structure to access these libraries. CodeIgniter lets you
+creatively focus on your project by minimizing the amount of code needed
+for a given task.
+
+CodeIgniter is Free
+===================
+
+CodeIgniter is licensed under an Apache/BSD-style open source license so
+you can use it however you please. For more information please read the
+:doc:`license agreement <../license>`.
+
+CodeIgniter is Light Weight
+===========================
+
+Truly light weight. The core system requires only a few very small
+libraries. This is in stark contrast to many frameworks that require
+significantly more resources. Additional libraries are loaded
+dynamically upon request, based on your needs for a given process, so
+the base system is very lean and quite fast.
+
+CodeIgniter is Fast
+===================
+
+Really fast. We challenge you to find a framework that has better
+performance than CodeIgniter.
+
+CodeIgniter Uses M-V-C
+======================
+
+CodeIgniter uses the Model-View-Controller approach, which allows great
+separation between logic and presentation. This is particularly good for
+projects in which designers are working with your template files, as the
+code these file contain will be minimized. We describe MVC in more
+detail on its own page.
+
+CodeIgniter Generates Clean URLs
+================================
+
+The URLs generated by CodeIgniter are clean and search-engine friendly.
+Rather than using the standard "query string" approach to URLs that is
+synonymous with dynamic systems, CodeIgniter uses a segment-based
+approach::
+
+	example.com/news/article/345
+
+Note: By default the index.php file is included in the URL but it can be
+removed using a simple .htaccess file.
+
+CodeIgniter Packs a Punch
+=========================
+
+CodeIgniter comes with full-range of libraries that enable the most
+commonly needed web development tasks, like accessing a database,
+sending email, validating form data, maintaining sessions, manipulating
+images, working with XML-RPC data and much more.
+
+CodeIgniter is Extensible
+=========================
+
+The system can be easily extended through the use of your own libraries,
+helpers, or through class extensions or system hooks.
+
+CodeIgniter Does Not Require a Template Engine
+==============================================
+
+Although CodeIgniter *does* come with a simple template parser that can
+be optionally used, it does not force you to use one. Template engines
+simply can not match the performance of native PHP, and the syntax that
+must be learned to use a template engine is usually only marginally
+easier than learning the basics of PHP. Consider this block of PHP code::
+
+	<ul>  <?php foreach ($addressbook as $name):?>  <li><?=$name?></li>  <?php endforeach; ?>  </ul>
+
+Contrast this with the pseudo-code used by a template engine::
+
+	<ul>  {foreach from=$addressbook item="name"}  <li>{$name}</li>  {/foreach}  </ul>
+
+Yes, the template engine example is a bit cleaner, but it comes at the
+price of performance, as the pseudo-code must be converted back into PHP
+to run. Since one of our goals is *maximum performance*, we opted to not
+require the use of a template engine.
+
+CodeIgniter is Thoroughly Documented
+====================================
+
+Programmers love to code and hate to write documentation. We're no
+different, of course, but since documentation is **as important** as the
+code itself, we are committed to doing it. Our source code is extremely
+clean and well commented as well.
+
+CodeIgniter has a Friendly Community of Users
+=============================================
+
+Our growing community of users can be seen actively participating in our
+`Community Forums <http://codeigniter.com/forums/>`_.
diff --git a/user_guide_src/source/overview/cheatsheets.rst b/user_guide_src/source/overview/cheatsheets.rst
new file mode 100644
index 0000000..2e277aa
--- /dev/null
+++ b/user_guide_src/source/overview/cheatsheets.rst
@@ -0,0 +1,16 @@
+#######################
+CodeIgniter Cheatsheets
+#######################
+
+Library Reference
+=================
+
+`|CodeIgniter Library
+Reference| <../images/codeigniter_1.7.1_library_reference.pdf>`_
+Helpers Reference
+=================
+
+`|image1| <../images/codeigniter_1.7.1_helper_reference.pdf>`_
+
+.. |CodeIgniter Library Reference| image:: ../images/codeigniter_1.7.1_library_reference.png
+.. |image1| image:: ../images/codeigniter_1.7.1_helper_reference.png
diff --git a/user_guide_src/source/overview/features.rst b/user_guide_src/source/overview/features.rst
new file mode 100644
index 0000000..44db08a
--- /dev/null
+++ b/user_guide_src/source/overview/features.rst
@@ -0,0 +1,46 @@
+####################
+CodeIgniter Features
+####################
+
+Features in and of themselves are a very poor way to judge an
+application since they tell you nothing about the user experience, or
+how intuitively or intelligently it is designed. Features don't reveal
+anything about the quality of the code, or the performance, or the
+attention to detail, or security practices. The only way to really judge
+an app is to try it and get to know the code.
+`Installing <../installation/>`_ CodeIgniter is child's play so we
+encourage you to do just that. In the mean time here's a list of
+CodeIgniter's main features.
+
+-  Model-View-Controller Based System
+-  Extremely Light Weight
+-  Full Featured database classes with support for several platforms.
+-  Active Record Database Support
+-  Form and Data Validation
+-  Security and XSS Filtering
+-  Session Management
+-  Email Sending Class. Supports Attachments, HTML/Text email, multiple
+   protocols (sendmail, SMTP, and Mail) and more.
+-  Image Manipulation Library (cropping, resizing, rotating, etc.).
+   Supports GD, ImageMagick, and NetPBM
+-  File Uploading Class
+-  FTP Class
+-  Localization
+-  Pagination
+-  Data Encryption
+-  Benchmarking
+-  Full Page Caching
+-  Error Logging
+-  Application Profiling
+-  Calendaring Class
+-  User Agent Class
+-  Zip Encoding Class
+-  Template Engine Class
+-  Trackback Class
+-  XML-RPC Library
+-  Unit Testing Class
+-  Search-engine Friendly URLs
+-  Flexible URI Routing
+-  Support for Hooks and Class Extensions
+-  Large library of "helper" functions
+
diff --git a/user_guide_src/source/overview/getting_started.rst b/user_guide_src/source/overview/getting_started.rst
new file mode 100644
index 0000000..5157d48
--- /dev/null
+++ b/user_guide_src/source/overview/getting_started.rst
@@ -0,0 +1,24 @@
+################################
+Getting Started With CodeIgniter
+################################
+
+Any software application requires some effort to learn. We've done our
+best to minimize the learning curve while making the process as
+enjoyable as possible.
+
+The first step is to :doc:`install <../installation/index>`
+CodeIgniter, then read all the topics in the **Introduction** section of
+the Table of Contents.
+
+Next, read each of the **General Topics** pages in order. Each topic
+builds on the previous one, and includes code examples that you are
+encouraged to try.
+
+Once you understand the basics you'll be ready to explore the **Class
+Reference** and **Helper Reference** pages to learn to utilize the
+native libraries and helper files.
+
+Feel free to take advantage of our `Community
+Forums <http://codeigniter.com/forums/>`_ if you have questions or
+problems, and our `Wiki <http://codeigniter.com/wiki/>`_ to see code
+examples posted by other users.
diff --git a/user_guide_src/source/overview/goals.rst b/user_guide_src/source/overview/goals.rst
new file mode 100644
index 0000000..ac58180
--- /dev/null
+++ b/user_guide_src/source/overview/goals.rst
@@ -0,0 +1,32 @@
+##############################
+Design and Architectural Goals
+##############################
+
+Our goal for CodeIgniter is maximum performance, capability, and
+flexibility in the smallest, lightest possible package.
+
+To meet this goal we are committed to benchmarking, re-factoring, and
+simplifying at every step of the development process, rejecting anything
+that doesn't further the stated objective.
+
+From a technical and architectural standpoint, CodeIgniter was created
+with the following objectives:
+
+-  **Dynamic Instantiation.** In CodeIgniter, components are loaded and
+   routines executed only when requested, rather than globally. No
+   assumptions are made by the system regarding what may be needed
+   beyond the minimal core resources, so the system is very light-weight
+   by default. The events, as triggered by the HTTP request, and the
+   controllers and views you design will determine what is invoked.
+-  **Loose Coupling.** Coupling is the degree to which components of a
+   system rely on each other. The less components depend on each other
+   the more reusable and flexible the system becomes. Our goal was a
+   very loosely coupled system.
+-  **Component Singularity.** Singularity is the degree to which
+   components have a narrowly focused purpose. In CodeIgniter, each
+   class and its functions are highly autonomous in order to allow
+   maximum usefulness.
+
+CodeIgniter is a dynamically instantiated, loosely coupled system with
+high component singularity. It strives for simplicity, flexibility, and
+high performance in a small footprint package.
diff --git a/user_guide_src/source/overview/index.rst b/user_guide_src/source/overview/index.rst
new file mode 100644
index 0000000..d541e79
--- /dev/null
+++ b/user_guide_src/source/overview/index.rst
@@ -0,0 +1,18 @@
+####################
+CodeIgniter Overview
+####################
+
+The following pages describe the broad concepts behind CodeIgniter:
+
+-  :doc:`CodeIgniter at a Glance <at_a_glance>`
+-  :doc:`Supported Features <features>`
+-  :doc:`Application Flow Chart <appflow>`
+-  :doc:`Introduction to the Model-View-Controller <mvc>`
+-  :doc:`Design and Architectural Goals <goals>`
+
+.. toctree::
+	:glob:
+	:hidden:
+	:titlesonly:
+	
+	*
\ No newline at end of file
diff --git a/user_guide_src/source/overview/mvc.rst b/user_guide_src/source/overview/mvc.rst
new file mode 100644
index 0000000..996745d
--- /dev/null
+++ b/user_guide_src/source/overview/mvc.rst
@@ -0,0 +1,27 @@
+#####################
+Model-View-Controller
+#####################
+
+CodeIgniter is based on the Model-View-Controller development pattern.
+MVC is a software approach that separates application logic from
+presentation. In practice, it permits your web pages to contain minimal
+scripting since the presentation is separate from the PHP scripting.
+
+-  The **Model** represents your data structures. Typically your model
+   classes will contain functions that help you retrieve, insert, and
+   update information in your database.
+-  The **View** is the information that is being presented to a user. A
+   View will normally be a web page, but in CodeIgniter, a view can also
+   be a page fragment like a header or footer. It can also be an RSS
+   page, or any other type of "page".
+-  The **Controller** serves as an *intermediary* between the Model, the
+   View, and any other resources needed to process the HTTP request and
+   generate a web page.
+
+CodeIgniter has a fairly loose approach to MVC since Models are not
+required. If you don't need the added separation, or find that
+maintaining models requires more complexity than you want, you can
+ignore them and build your application minimally using Controllers and
+Views. CodeIgniter also enables you to incorporate your own existing
+scripts, or even develop core libraries for the system, enabling you to
+work in a way that makes the most sense to you.
